2010-02-28 30 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