考虑以下代码提出的说明:
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
中的每个元组,我需要执行相同的操作,但是我不能使用相同的对象,因为它会添加上一次迭代的效果。因此,在每次迭代开始时,我都会创建一个新实例。
我的问题是,如果这样做会造成内存泄漏吗?我必须为每个创建的对象执行哪些操作? (可能删除它?或者通过将新对象分配给它被清除的相同名称?)
答案 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
块)包装系统资源,您应该没有问题。