Python:当项目被删除时,set类是否“泄漏”,比如dict?

2024-06-16 15:05:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道Python dicts在移除项时会“泄漏”(因为项的槽将被神奇的“removed”值覆盖)…但是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.

Tags: theinaddforkeysgcremovebut
2条回答

对于这样的问题,最好先做一个这样的快速实验,看看会发生什么:

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

医生和人们所说的和实际的行为往往是不一致的。如果这对你很重要,测试一下。不要依赖别人。在

是的,set基本上是一个哈希表,就像dict一样,接口上的差异并不意味着“下面”有多少不同。每隔一段时间,您应该复制集合myset = set(myset),就像您应该复制一段时间内经常进行许多添加和删除的dict一样。在

相关问题 更多 >