Python中"dict"的内存分配是如何工作的



我玩字典时发现了这个。

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

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

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

但它并不是随着每一次添加而增长;每次它需要更多的空间时,它都会添加一些内存块;X〃;键值对的数量;X〃;数量被填满,另一块内存被分配给字典。

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

import sys
my_dict = {}
print("Size with {} keys:t {}".format(0, sys.getsizeof(my_dict)))
for i in range(21):
my_dict[i] = ''
print("Size with {} keys:t {}".format(i+1, sys.getsizeof(my_dict)))

以下是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不测量容器及其所有内容的大小。

您可以在此处使用此功能或更多信息。

相关内容

最新更新