垃圾收集器使用了多长时间?

时间:2011-05-24 18:27:55

标签: python garbage-collection profile

我的python程序有一个奇怪的性能行为:它运行的时间越长,它就越慢。在早期,它每分钟发出数十个工作单位。经过一个小时后,每个工作单位需要几十分钟。我怀疑这是由拥挤的垃圾收集器引起的。

问题是,我的脚本太缺乏内存,因此cProfile可以在大型运行中运行。 (见:cProfile taking a lot of memory

我们编写了自己的性能插件,我们可以观察系统的大部分内容,但似乎没有任何问题。仍未解决的一块岩石是GC。

是否有其他方式(除了配置文件或cProfile)以查看GC的时间?

1 个答案:

答案 0 :(得分:7)

在Python中,大多数垃圾是使用引用计数收集的。人们会期望这是快速而无痛的,这似乎不太可能是你所追求的。我假设你问的是gc模块引用的收集器,它只用于循环引用。

有一些可能有用的东西:http://docs.python.org/library/gc.html

虽然似乎没有直接的方法来时间垃圾收集器,但您可以打开和关闭它,启用调试,查看收集计数等。所有这些可能会有所帮助在你的任务中。

例如,在我的系统上gc打印出打开调试标志所用的时间:

In [1]: import gc

In [2]: gc.set_debug(gc.DEBUG_STATS)

In [3]: gc.collect()
gc: collecting generation 2...
gc: objects in each generation: 159 2655 7538
gc: done, 10 unreachable, 0 uncollectable, 0.0020s elapsed.

除此之外,我首先要看的是程序运行时内存使用情况的演变。一种可能性是,它只是达到可用物理RAM的限制,并且由于过多的页面错误而减慢,而不是由于与垃圾收集器有关。