在python中为空字典分配了多少空间?

在python中为空字典分配了多少空间?,python,dictionary,Python,Dictionary,如果我们创建一个空字典,比如:idict={},那么为这个字典分配了多少空格?我知道,对于列表,如果我们初始化一个列表,比如ilist=[],它总是会过度分配大小,首先是4个空间,然后是8个空间。 那么字典呢?好吧,字典里不存储实际的字符串,它的工作原理有点像C/C++指针,所以字典中每个元素的开销都是恒定的 测试 import sys x = {} sys.getsizeof(x) 字典本身由多个存储桶组成,每个存储桶包含: 当前存储的对象的哈希代码(不可预测) 由于碰撞解决方案,从铲斗位

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

那么字典呢?

好吧,字典里不存储实际的字符串,它的工作原理有点像C/C++指针,所以字典中每个元素的开销都是恒定的

测试

import sys
x = {}
sys.getsizeof(x)
字典本身由多个存储桶组成,每个存储桶包含:

  • 当前存储的对象的哈希代码(不可预测) 由于碰撞解决方案,从铲斗位置开始 (使用的策略)

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

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


字典一开始有8个空桶,当达到容量时(当前为(2n+1)/3),通过将条目数翻倍来调整大小。

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

如果我们要检查ASCII字符的重复,分配256大小的列表更便宜还是分配一个字典更便宜?要检查重复项,一个集合似乎更合适,因为检查成员资格是集合的一个典型基本操作。“字典从8个空桶开始,在达到容量时通过将条目数加倍来调整大小。”类似于。事实上,当它们大约满了2/3时,它们的增长量是经过计算的。在这里你可以看到完整的解释