ger*_*rit 20 python garbage-collection
Pythons gc.disable禁用自动垃圾收集.据我了解,这会产生一些副作用.为什么有人想要禁用自动垃圾收集,如何在没有自动垃圾收集的情况下有效管理内存?
unu*_*tbu 20
禁用垃圾收集器的一个用途是在计算代码性能时获得更一致的结果.该timeit模块执行此操作.
def timeit(self, number=default_number):
if itertools:
it = itertools.repeat(None, number)
else:
it = [None] * number
gcold = gc.isenabled()
gc.disable()
...
Run Code Online (Sandbox Code Playgroud)
在Python2和Python3.2 gc.disable()中也用于避免由fork和之间发生的垃圾收集引起的错误exec.这个问题似乎已在Python3.3中修复,无需调用gc.disable().
在您链接到的同一页面上:
由于收集器补充了Python中已经使用的引用计数,因此如果您确定程序不创建引用循环,则可以禁用收集器.
所以这回答了问题的第二部分,"如何在没有它的情况下有效地管理记忆".不要创建参考周期.当然,这是一个相当有限的用例.
对于问题的第一部分,答案是表现.同样,一个相当有限的用例.
禁用GC只会在以下情况下有所帮助:(a)GC实际上正在工作,(b)工作没有实现任何目的,也就是说它没有找到任何可以解放的东西,或者发现你认为你的程序可以容忍泄漏只要GC被禁用.因此,如果您的程序太慢并且没有创建参考周期并且禁用GC似乎加速了它,那么您将考虑禁用GC.
我推测(基于我之前见过的GC,特别是Python),如果你没有分配任何内存,那么垃圾收集器将不会有任何长期的性能成本.它可能会有一些短期和不可预测的成本,可以整理以前的成本.所以,即使你正在进行大规模的numpy数字运算,并认为你应该从代码的那一部分中挤出所有可能的性能,但在你这样做时禁用GC仍然无济于事.它只会延迟整理先前参考周期的时间成本,直到重新启用GC为止.
可以说,运行时间短且不占用大量内存的程序不需要垃圾回收,它们可以容忍泄漏.但更有说服力的是,如果你开始这样思考,你最终会遇到一个泄漏了比预期更多内存的程序.