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

Mat*_*ten 8 python profile garbage-collection

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

问题在于,我的脚本太缺乏内存,因此cProfile可以在大型运行中工作.(参见:cProfile占用大量内存)

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

有没有其他方式(除了配置文件或cProfile),看看有多少时间去GC?

NPE*_*NPE 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.
Run Code Online (Sandbox Code Playgroud)

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