2011-08-31 16 views
1

我注意到一旦生成器耗盡,對象仍保留在內存中。 如何讓生成器對象在耗盡後自動從內存中移出?在StopIteration(Python)中自動從內存中刪除生成器對象

+1

如果你只有一個引用它,只是'del generator'。 – agf

+0

@agf:請將您的答案發布爲答案,以便我們可以正確地對其進行修改。 –

+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它。

1

這不是Python支持的操作。