python - 为什么空字典的大小与 Python 中非空字典的大小相同?

标签 python memory python-2.7 dictionary

这可能是微不足道的,但我不确定我是否理解,我尝试谷歌搜索但没有找到令人信服的答案。

>>> sys.getsizeof({})
140
>>> sys.getsizeof({'Hello':'World'})
140
>>>
>>> yet_another_dict = {}
>>> for i in xrange(5000):
        yet_another_dict[i] = i**2

>>> 
>>> sys.getsizeof(yet_another_dict)
98444

我怎么理解这个? 为什么空字典的大小与非空字典的大小相同?

最佳答案

有两个原因:

  1. 字典只保存对对象的引用,而不是对象本身,因此它的大小与其包含的对象的大小无关,而是与字典包含的引用(项目)的数量相关。

  2. 更重要的是,字典为 block 中的引用预先分配内存。因此,当您创建字典时,它已经为第一个 n 引用预分配了内存。当它填满内存时,它会预先分配一个新 block 。

您可以观察该行为,运行下一段代码。

d = {}
size = sys.getsizeof(d)
print size
i = 0
j = 0
while i < 3:
    d[j] = j
    j += 1
    new_size = sys.getsizeof(d)
    if size != new_size:
        print new_size
        size = new_size
        i += 1

打印出来的:

280
1048
3352
12568

在我的机器上,但这取决于架构(32 位、64 位)。

关于python - 为什么空字典的大小与 Python 中非空字典的大小相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18558865/

相关文章:

python - Python 的 id 函数的 Matlab 等价物

python - 在 Python 中将列表转换为元组

python - 在 mac (Big Sur) 上导入模块的问题,以及 sys.executable 和包的位置不匹配?

python - C++ 的 SWIG,未找到符号 : Expected in: flat namespace

python - MATLAB 中的 Memmap 用于大数组

c++ - 在 Windows 中分配内存

javascript - Flask + Ajax 集成 : AttributeError: 'WSGIRequestHandler' object has no attribute 'environ'

python - appengine 延迟任务问题,执行抛出未知错误

python - 难以理解类方法

python - 如何更新已安装的模块路径?奥多