这段代码是否会在python中造成内存泄漏?

2024-10-01 15:35:18 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑以下代码作为说明建议:

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中的每个元组,我需要执行相同的操作,但是我不能使用相同的对象,因为它会增加上一次迭代的效果。因此,在每次迭代开始时,我都会创建一个新实例。在

我的问题是这样做是否会造成内存泄漏?我要对创建的每个对象执行什么操作?(也许删掉?或者通过将新对象指定为相同的名称,它将被清除?)在


Tags: 对象实例代码importmodforobjecta1
1条回答
网友
1楼 · 发布于 2024-10-01 15:35:18

tl,dr;不

Python的引用实现使用引用计数进行垃圾收集。还有一些其他实现使用不同的GC策略,这会影响调用__del__方法的精确时间,这在pypyy、Jython或IronPython中可能是可靠的,也可能是不及时的。这些差异并不重要,除非在处理诸如文件指针和其他昂贵的系统资源之类的资源时。在

在cPython中,当引用计数为零时,GC将清除对象。例如,当您在for循环中执行acumulator = mod.AcumulatorObject()操作时,新对象将在下一次迭代中替换旧对象-由于没有其他变量引用旧对象,因此在下一次GC过程中将对其进行垃圾回收。参考实现cPython会破坏您的特性,比如当资源超出范围时自动释放资源,但是YMMV会考虑其他实现。在

这就是为什么很多人评论说,在Python中内存泄漏是不值得关注的。在

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

Yes, I had previously played with sys.setcheckinterval. I changed it to 1000 (from its default of 100), but it didn't do any measurable difference. Disabling Garbage Collection has helped - thanks. This has been the biggest speedup so far - saving about 20% (171 minutes for the whole run, down to 135 minutes) - I'm not sure what the error bars are on that, but it must be a statistically significant increase.

只要遵循使用with或(try/finally块)包装系统资源的最佳实践,就不会有任何问题。在

相关问题 更多 >

    热门问题