在StopIteration(Python)自动从内存中删除生成器对象

时间:2011-08-31 01:24:03

标签: python memory-management generator

我注意到一旦发电机耗尽,物体就会留在内存中。 如何使生成器对象在耗尽后自动从内存中删除?

2 个答案:

答案 0 :(得分:1)

这不是Python支持的操作。

答案 1 :(得分:1)

您可以尝试制作一个包装器生成器,确保它在完成后没有对内部生成器的引用。以下甚至可能会这样做(完全未经测试):

def strange(gen):
    for thing in gen:
        yield thing

一旦gen提升StopIterationstrange生成器将退出for循环,然后返回None,这将再次提升StopIteration。如果gen是对生成器的最后一个引用,那么它应该/可能在任何代码迭代strange(gen)之前进行垃圾回收。在CPython上意味着它被释放了。

请注意,如果您执行以下操作,那将无济于事:

g = some_generator()
for x in strange(g):
    do_something()

因为g本身是对内部生成器的引用。你必须更像这样使用它:

for x in strange(some_generator()):
    do_something()

但实际上,最简单的方法是当你不希望它在内存中闲逛时,对任何其他对象做你做的事情:确保你没有坚持对它的引用。如果引用它的变量属于长期范围,则可以明确del它。