Python 中 `dict` 的内存分配是如何工作的?
How allocation of memory for `dict` in Python works?
我在玩字典时发现了这个。
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 中的词典大小如何工作?
当您创建一个空字典时,它会以块的形式为它可以存储的最初几个引用预分配内存。随着字典添加更多的键值对,它需要更多的内存。
但它不会随着每次添加而增长;每次它需要更多 space 时,它都会添加一些可以容纳“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
此外,字典仅存储保存键和值的内存引用,并不将键值本身存储为 dict
对象的一部分。因此,数据的类型和大小都不会影响字典 sys.getsizeof()
的结果。
例如,下面两个字典的大小都是 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 不测量容器及其所有内容的大小。
你可以使用这个function or more info here。
我在玩字典时发现了这个。
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 中的词典大小如何工作?
当您创建一个空字典时,它会以块的形式为它可以存储的最初几个引用预分配内存。随着字典添加更多的键值对,它需要更多的内存。
但它不会随着每次添加而增长;每次它需要更多 space 时,它都会添加一些可以容纳“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
此外,字典仅存储保存键和值的内存引用,并不将键值本身存储为 dict
对象的一部分。因此,数据的类型和大小都不会影响字典 sys.getsizeof()
的结果。
例如,下面两个字典的大小都是 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 不测量容器及其所有内容的大小。
你可以使用这个function or more info here。