Python:当删除项目时,set类是否会“泄漏”,就像dict一样?

时间:2010-02-28 04:08:44

标签: python set dictionary

我知道Python dict会在删除项目时“泄漏”(因为项目的插槽将被魔术“删除”值覆盖)...但set类的行为是否相同办法?保持set周围,随着时间的推移添加和删除内容是否安全?

编辑:好的,我已经尝试过了,这就是我发现的内容:

>>> 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.

2 个答案:

答案 0 :(得分:7)

是的,set基本上是一个哈希表,就像dict一样 - 界面上的差异并不意味着“低于”它的许多差异。有一段时间,你应该复制一套 - myset = set(myset) - 就像你应该对一个dict进行复制一样,随着时间的推移会定期进行多次添加和删除。

答案 1 :(得分:-1)

对于像这样的问题,通常最好像这样进行快速实验,看看会发生什么:

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

文档和人们说什么,实际上是什么行为往往是不一致的。如果这对您很重要,请进行测试。不要依赖他人。