我知道Python dict
s在移除项时会“泄漏”(因为项的槽将被神奇的“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.
对于这样的问题,最好先做一个这样的快速实验,看看会发生什么:
医生和人们所说的和实际的行为往往是不一致的。如果这对你很重要,测试一下。不要依赖别人。在
是的,
set
基本上是一个哈希表,就像dict
一样,接口上的差异并不意味着“下面”有多少不同。每隔一段时间,您应该复制集合myset = set(myset)
,就像您应该复制一段时间内经常进行许多添加和删除的dict一样。在相关问题 更多 >
编程相关推荐