使用IPython的%prun对我的代码进行性能分析,我发现大部分函数时间都花费在垃圾回收上(0.334秒 vs. 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)
我尝试在调用函数之前和返回值后禁用/启用垃圾回收,但时机几乎相同。
import gc
gc.disable()
x = foo()
gc.disable()
有人知道为什么这是一个瓶颈,以及如何加速吗?
我的Python/Pandas版本如下:
Python 2.7.11 |Continuum Analytics, Inc.| (default, Dec 6 2015, 18:57:58)
Pandas 0.17.1
gc.collect = lambda: None
(然后再放回去!)。也许有些更深层次的东西启用了 gc 并手动进行收集。不知道这是否真正有效,但值得一试。 - Andy Hayden