【问题标题】:memory management for dictionary in pythonpython中字典的内存管理
【发布时间】:2016-07-12 10:52:44
【问题描述】:

我有以下代码,我不明白这背后的场景,请任何人解释一下。

import sys
data={}
print sys.getsizeof(data)
######output is 280
data={ 1:2,2:1,3:2,4:5,5:5,6:6,7:7,8:8,9:9,0:0,11:11,12:12,13:13,14:14,15:15}
print sys.getsizeof(data)
######output is 1816
data={1:2,2:1,3:2,4:5,5:5,6:6,7:7,8:8,9:9,0:0,11:11,12:12,13:13,14:14,15:15,16:16}
print sys.getsizeof(data)
##### output is 1048

如果我们增加字典的长度,那么它应该增加内存的大小,但它会减少为什么?

【问题讨论】:

  • 在我的机器上不是这样的,你能不能在终端上测试一下!
  • 请注意,这仅在创建新字典时有效,例如,如果您对第二个字典执行data[16] = 16,则大小仍为 1816。sys.getsizeof 返回对象的大小,而不是它包含的对象。此外,最后一个 dict 的大小比第二个小的原因与 Python 中的哈希表有关。较小的字典会导致更多的冲突,所以我想这与它有关。我敦促您查看Brandon Rhodes' talk "The mighty dictionary",以获得更深入的解释。
  • 我在 ipython (mac 64 bit) 上做过这个
  • 我注意到,当 len(data)=22 内存大小变为 3352 时,len(data)=32 内存大小再次减小并变为 1816,每 10 个元素间隔其减小和增加的倍数1536 所以当 len(data)=42 然后 6424 ,即 3352+1536*2 。但仍然没有找到正确的场景,为什么这是由 python 遵循的。

标签: python python-2.7


【解决方案1】:

getsizeof() 调用对象的__sizeof__ 方法,如果对象由垃圾收集器管理,则会增加额外的垃圾收集器开销。

Windows x64 - 如果是这样:

data={ 1:2,2:1,3:2,4:5,5:5,6:6,7:7,8:8,9:9,0:0,11:11,12:12,13:13,14:14,15:15}
print sys.getsizeof(data)
print data
data[16]=16
print sys.getsizeof(data)
print data

印刷:

1808
{0: 0, 1: 2, 2: 1, 3: 2, 4: 5, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15}
1808
{0: 0, 1: 2, 2: 1, 3: 2, 4: 5, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16}

但我在重写数据字典时确实注意到了与您提到的相同的行为:

272  #empty data dict
1808 # 15 elements in data dict
1040 # 16 elements in data dict

【讨论】:

    猜你喜欢
    • 2014-06-04
    • 2014-03-30
    • 2010-09-27
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多