我注意到一旦发电机耗尽,物体就会留在内存中。 如何使生成器对象在耗尽后自动从内存中删除?
答案 0 :(得分:1)
这不是Python支持的操作。
答案 1 :(得分:1)
您可以尝试制作一个包装器生成器,确保它在完成后没有对内部生成器的引用。以下甚至可能会这样做(完全未经测试):
def strange(gen):
for thing in gen:
yield thing
一旦gen
提升StopIteration
,strange
生成器将退出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
它。