Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中“dict”的内存分配是如何工作的?_Python_Dictionary_Hashmap_Size - Fatal编程技术网

Python中“dict”的内存分配是如何工作的?

Python中“dict”的内存分配是如何工作的?,python,dictionary,hashmap,size,Python,Dictionary,Hashmap,Size,我在玩字典时发现了这个 import sys Square1 = {} Square2 = {} Square3 = {} for i in range(1, 8): Square1[i] = i**2 for i in range(1, 11): Square2[i] = i**2 for i in range(1, 12): Square3[i] = i**2 print(sys.getsizeof(Square1), len(Square1)) prin

我在玩字典时发现了这个

import sys

Square1 = {}
Square2 = {}
Square3 = {}

for i in range(1, 8):
    Square1[i] = i**2

for i in range(1, 11):
    Square2[i] = i**2

for i in range(1, 12):
    Square3[i] = i**2


print(sys.getsizeof(Square1), len(Square1))
print(sys.getsizeof(Square2), len(Square2))
print(sys.getsizeof(Square3), len(Square3))
输出:

196 7
196 10
344 11
字典长度7和10的大小与196相同,但长度11的大小为344。
为什么它们是一样的?为什么尺寸会随着长度的增加而增加11?在Python中,字典大小是如何工作的?

当您创建一个空字典时,它会将内存分块预先分配给它可以存储的最初几个引用。随着字典添加更多的键值对,它需要更多的内存

但它不会随着每次添加而增长;每次需要更多的空间时,它都会添加一些内存块,这些内存块可以容纳“X”数量的键值对,一旦“X”数量被填满,另一块内存就会分配给字典

下面是一个示例代码,用于显示随着键数的增加字典大小的变化:

以下是Python 3.6.2中的输出:

#same size for key count 0 - 5 : 240 Bytes
Size with 0 keys:    240
Size with 1 keys:    240
Size with 2 keys:    240
Size with 3 keys:    240
Size with 4 keys:    240
Size with 5 keys:    240

#same size for key count 6 - 10 : 360 Bytes
Size with 6 keys:    368
Size with 7 keys:    368
Size with 8 keys:    368
Size with 9 keys:    368
Size with 10 keys:   368

#same size for key count 11 - 20 : 648 Bytes
Size with 11 keys:   648
Size with 12 keys:   648
Size with 13 keys:   648
Size with 14 keys:   648
Size with 15 keys:   648
Size with 16 keys:   648
Size with 17 keys:   648
Size with 18 keys:   648
Size with 19 keys:   648
Size with 20 keys:   648

此外,dictionary只存储保存键和值的内存引用,而不将键值本身作为
dict
对象的一部分存储。因此,数据的类型和大小都不会影响字典的
sys.getsizeof()
结果

例如,下面两个dict的大小都是280字节

>>> sys.getsizeof({'a': 'a'})
280

>>> sys.getsizeof({'a'*100000: 'a'*1000000})
280
但是,以下是
'a'
V/s
'a'*1000000的大小之间的差异:

>>> sys.getsizeof('a')
38

>>> sys.getsizeof('a'*1000000)
1000037

因为字典是一个容器,sys.getsizeof不会度量容器及其所有内容的大小


您可以使用此信息或更多信息。

您是否阅读了
sys.getsizeof
的文档?
>>> sys.getsizeof('a')
38

>>> sys.getsizeof('a'*1000000)
1000037