【问题标题】:how many space assigned for empty dictionary in python? [duplicate]在python中为空字典分配了多少空间? [复制]
【发布时间】:2015-09-28 18:37:27
【问题描述】:

如果我们创建一个空字典,例如:idict = {},那么为这个字典分配了多少个空格?我知道对于列表,如果我们初始化像ilist = [] 这样的列表,它总是会过度分配大小,首先是 4 个空间,然后是 8 个。
字典呢?

【问题讨论】:

  • 如果要检查 ASCII 字符的重复,分配 256 大小的列表更便宜还是分配字典更便宜?
  • 检查重复的集合似乎更合适,因为检查成员资格是集合的典型基本操作。

标签: python dictionary


【解决方案1】:

好吧,字典并不在其中存储实际的字符串,它的工作方式有点像 C/C++ 指针,所以你只会在字典中为每个元素获得一个恒定的开销。

测试

import sys
x = {}
sys.getsizeof(x)

字典本身由许多桶组成,每个桶包含:

  • 当前存储的对象的哈希码(不可预测 由于碰撞解决,从桶的位置 使用的策略)

  • 指向键对象的指针 指向值的指针

  • 对象在 32 位上总共至少 12 个字节,在 64 位上至少 24 个字节。

字典以 8 个空存储桶开始,并在达到其容量时通过将条目数加倍来调整大小(当前为 (2n+1)/3)。

【讨论】:

  • “字典从 8 个空桶开始,只要达到其容量,就会通过将条目数加倍来调整大小。” 排序。事实上,当它们大约装满 2/3 时,它们会增长一个计算量。在这里你可以看到完整的解释hg.python.org/cpython/file/tip/Objects/dictobject.c#l258
【解决方案2】:

老实说,它实际上就像C++ 中的associative map 一样工作。如果你曾经使用过C++,那么......如果你看到Python Interpreter 的源代码,你会发现它使用了你的堆内存部分将数据存储到两种类型并使用指针将一个数据指向另一个数据,就像mapC++ 中一样。在我的系统中它是 280 .. 现在正如@Navneet 所说,您可以使用 sys.getsizeof 来计算大小。但请记住,它是特定于系统的,因此您的系统可能不会给您 280 字节。理解如果是280bytes,就意味着它使用了一个由几个关联指针组成的微妙线程来存储一个指向数据结构的点

【讨论】:

    猜你喜欢
    • 2019-10-18
    • 2020-10-18
    • 2010-12-07
    • 2012-09-13
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    相关资源
    最近更新 更多