簡體   English   中英

為 Python 中的 `dict` 分配 memory 如何工作?

[英]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))

Output:

196 7
196 10
344 11

Dictionary 長度 7 和 10 的大小與 196 相同,但長度 11 的大小為 344。為什么它們相同? 為什么尺寸會隨着長度 11 而增加? Python 中的字典大小如何工作?

當您創建一個空字典時,它會以塊的形式預先分配 memory 以用於它可以存儲的初始少數引用。 隨着字典添加更多的鍵值對,它需要更多的 memory。

但它不會隨着每次添加而增長。 每次需要更多空間時,它會添加一些 memory 塊,可以容納“X”個鍵值對,一旦“X”個量被填充,另一塊 memory 被分配給字典。

這是顯示更改的示例代碼是字典的大小隨着鍵的數量增加

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 中的 output:

#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

此外,字典只存儲 memory 的引用,該引用包含鍵和值,並且不將鍵值本身存儲為dict object 的一部分。 所以數據的類型和大小都不會影響字典的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或更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM