这段代码是否在python中创建了内存泄漏?

时间:2018-02-28 17:56:19

标签: python python-3.x

考虑以下代码提出的说明:

import mod

f1s = ["A1", "B1", "C1"]
f2s = ["A2", "B2", "C2"]

for f1, f2 in zip(f1s,f2s):

    # Creating an object
    acumulator = mod.AcumulatorObject()

    # Using object
    acumulator.append(f1)
    acumulator.append(f2)

    # Output of object
    acumulator.print()

因此,我在for的开头使用类的实例来执行操作。对于for中的每个元组,我需要执行相同的操作,但是我不能使用相同的对象,因为它会添加上一次迭代的效果。因此,在每次迭代开始时,我都会创建一个新实例。

我的问题是,如果这样做会造成内存泄漏吗?我必须为每个创建的对象执行哪些操作? (可能删除它?或者通过将新对象分配给它被清除的相同名称?)

1 个答案:

答案 0 :(得分:3)

TL,博士;无

Python的参考实现使用引用计数进行垃圾收集。还有其他实现使用不同的GC策略,这会影响调用__del__方法的精确时间,这些方法可能在PyPy,Jython或IronPython中可靠或不可靠。除非您处理文件指针和其他昂贵的系统资源等资源,否则这些差异并不重要。

在cPython中,当引用计数为零时,GC将擦除对象。例如,当你在acumulator = mod.AcumulatorObject()循环中执行for时,新对象会在下一次迭代中替换旧对象 - 并且因为没有其他变量引用旧对象,所以它将被垃圾收集在下一次GC通过。参考实现cPython会破坏你在超出范围时自动释放资源的事情,但是关于其他实现的YMMV。

这就是为什么很多人评论内存泄漏在Python中并不重要。

您可以使用cg模块完全控制cPython的垃圾收集器。默认设置非常保守,在10年内以Python为生,我从未必须手动触发GC循环 - but I've seen a situation where delaying it helped performance

  

是的,我之前玩过sys.setcheckinterval。我将其更改为1000(默认值为100),但它没有做任何可衡量的差异。禁用垃圾收集有所帮助 - 谢谢。这是迄今为止最大的加速 - 节省了大约20%(整个运行时间为171分钟,下降到135分钟) - 我不确定错误条是什么,但它必须是统计上显着的增加。 / p>

只需遵循最佳做法,例如使用with或(try/finally块)包装系统资源,您应该没有问题。