为什么垃圾收集这么慢?

Ale*_*der 7 python garbage-collection pandas

使用%prun在IPython中分析我的代码,我注意到大部分功能时间花在垃圾收集上(0.334s与0.428总时间).

79254 function calls (77408 primitive calls) in 0.428 seconds

Ordered by: internal time

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
     5    0.334    0.067    0.334    0.067 {gc.collect}
 15757    0.005    0.000    0.007    0.000 {isinstance}
  1584    0.002    0.000    0.004    0.000 dtypes.py:68(is_dtype)
Run Code Online (Sandbox Code Playgroud)

我已经尝试在调用函数之前和返回它的值之后禁用/启用垃圾收集,但时间几乎完全相同.

import gc

gc.disable()
x = foo()
gc.disable()
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么这是一个瓶颈以及如何加快它?

我的Python/Pandas版本如下:

Python 2.7.11 |Continuum Analytics, Inc.| (default, Dec  6 2015, 18:57:58) 
Pandas 0.17.1
Run Code Online (Sandbox Code Playgroud)

Sta*_*kop 0

您已禁用gc,因此实际上可能有某些东西gc.collect显式调用。你可以在 IPython 中使用这个技巧来找到罪魁祸首:

import gc
import traceback

old_collect = gc.collect

def new_collect(*args, **kwargs):
    traceback.print_stack()
    old_collect(*args, **kwargs)

gc.collect = new_collect
Run Code Online (Sandbox Code Playgroud)

请注意,仅当代码起作用时它才起作用import gc,它不起作用from gc import collect(我们正在操作 gc 模块)。

如果您发现错误,请报告错误。