2010-02-28 46 views
4

我知道Python dict將在物品被移除時「泄漏」(因爲物品的插槽將被魔術「已刪除」的值所覆蓋)...但set類的行爲方式是否相同?保留一個set是否安全,隨着時間的推移添加和刪除它的東西?Python:當物品被移除時,集合類是否「泄漏」,如字典?

編輯:好吧,我已經嘗試過了,這裏是我的發現:

 
>>> import gc 
>>> gc.collect() 
0 
>>> nums = range(1000000) 
>>> gc.collect() 
0 
### rsize: 20 megs 
### A baseline measurement 
>>> s = set(nums) 
>>> gc.collect() 
0 
### rsize: 36 megs 
>>> for n in nums: s.remove(n) 
>>> gc.collect() 
0 
### rsize: 36 megs 
### Memory usage doesn't drop after removing every item from the set… 
>>> s = None 
>>> gc.collect() 
0 
### rsize: 20 megs 
### … but nulling the reference to the set *does* free the memory. 
>>> s = set(nums) 
>>> for n in nums: s.remove(n) 
>>> for n in nums: s.add(n) 
>>> gc.collect() 
0 
### rsize: 36 megs 
### Removing then re-adding keys uses a constant amount of memory… 
>>> for n in nums: s.remove(n) 
>>> for n in nums: s.add(n+1000000) 
>>> gc.collect() 
0 
### rsize: 47 megs 
### … but adding new keys uses more memory. 
+3

當你說Python字典會「泄漏」時,你能證實你的意思嗎?也許是對其他來源的引用? – 2010-02-28 04:13:40

+2

AFAIK字典不會真正泄漏 - 例如(當你設置新的項目時)替換刪除值的假人是purget – 2010-02-28 04:15:46

回答

7

是,set基本上是一個哈希表就像dict - 在界面上不要」的區別t意味着「低於」它的許多差異。有一段時間,你應該複製設置 - myset = set(myset) - 就像你應該有一個字典一樣,隨着時間的推移,許多添加和刪除。

+0

那麼字典泄漏? – 2010-02-28 04:47:34

+1

@Anurag,如果你在長時間運行的程序中不斷添加和刪除密鑰,dict可以消耗越來越多的內存並減慢速度。 – 2010-02-28 05:00:01

+2

調用這種「泄漏」行爲是過度簡化和誤導性的,但重點在於爲高流量字典或集合創建一個新副本可以節省內存*和*加快速度! – 2010-02-28 05:01:43

-1

對於這樣的問題往往是最好的運行快速實驗像這樣的,看看會發生什麼:

s = set() 
for a in range(1000): 
    for b in range(10000000): 
    s.add(b) 
    for b in range(10000000): 
    s.remove(b) 

什麼文檔和人說,什麼行爲實際上就是往往相左。如果這對你很重要,請測試它。不要依賴別人。

+0

爲了記錄,我沒有看到該代碼泄漏的證據。記憶體使用一下子跳起來,然後保持平穩。 – 2010-02-28 04:26:32

+0

通常我會同意......但是當講述的人是Alex Martelli時,我會繼續前進並相信他。 – 2010-02-28 04:27:53

+0

是的,這就是問題所在 - 最後(所有東西都被刪除後),它應該再次下降。作爲GC'd語言,很難知道何時可以回收的所有內存已被回收。 – 2010-02-28 04:29:23