假設在 python3 中,我們使用了一個字典:
my_dct = {}
...
for i in range(100):
my_dct[i] = True
...
for s in "potentially long string":
my_dct[s] = True
我的問題是當我們通過python解釋器運行上面的python程式時,解釋器在第一行創建了什么容量的容器?根據這個大小,在第一個或第二個 for 回圈的程序中容量會增加嗎?
此鏈接顯示容量 8。雖然根據型別,128、2^15 等顯示為在 python 中實體化字典時容器的容量。
非常感謝任何解釋,謝謝。
uj5u.com熱心網友回復:
存盤如何dict
隨著增長而調整是一個實作細節,大多數用戶不需要知道。如果您是開發人員,或者想用 C 撰寫自己的代碼,那么詳細資訊可能會很有用。但是對于在串列和字典之間進行選擇,它們并不重要。
串列和字典之間的重要區別在于它們的索引方式。串列由整數(或切片)索引,并“包含”所有值直到它的len
. 字典由鍵索引,鍵可以是任何可散列的物件。字串是最常見的。
In [1]: import sys
從表面上看,這兩個物件是等價的:
In [2]: adict = {i:True for i in range(100)}
In [3]: alist = [i for i in range(100)]
兩者都有len()
100,并且可以以相同的方式索引:
In [4]: adict[50]
Out[4]: True
In [5]: alist[50]
Out[5]: 50
糟糕,我的意思是使用alist = [True for i in range(100)]
100 個True
值的串列,而不是list(range(100))
. 但這不會改變下面的討論。
一個關鍵的區別是串列索引必須是連續的。也就是說,如果我們想使用alist[200]
,我們將不得不向串列中添加另外 101 個值。而adict[200]=False
只需將 1 添加200
到哈希表中,新len
的 101。
底層存盤完全不同。
alist
有一個 C 陣列,其中包含 100 個值的參考,加上一些“頭部空間”以允許快速增長alist.append(...)
。
adict
有一個哈希表,它以某種方式存盤對鍵和值的參考。
在這兩種情況下,隨著它們的增長,存盤空間(“容器”?)在填滿時必須重新分配。同樣,細節取決于實作,并且對用戶來說很大程度上是不可見的——除非我們仔細跟蹤記憶體或時間。
我已經看到了許多試圖比較getsizeof
串列和陣列的 SO 問題。答案總是指出,這種比較的價值有限,因為它衡量的是非常不同的事物。
In [8]: sys.getsizeof(alist)
Out[8]: 904
In [9]: sys.getsizeof(adict)
Out[9]: 4696
對于 a list
,getsizeof
基本上是存盤值參考的 C 陣列的大小。對于len(alist)
100,這是 8*100 位元組,大約有 13 個值的增長空間——此時必須重新分配它。
添加 6 個值不會改變大小:
In [11]: alist.extend([True]*6)
In [12]: len(alist)
Out[12]: 106
In [13]: sys.getsizeof(alist)
Out[13]: 904
添加另外 6 個,強制重新分配,具有更大的頭部空間(對于 27 個參考):
In [14]: alist.extend([True]*6)
In [15]: len(alist)
Out[15]: 112
In [16]: sys.getsizeof(alist)
Out[16]: 1112
我假設getsizeof(adict)
度量哈希表的大小。那是相當大一點。
再添加 12 個鍵adict
不會改變大小。有足夠的空間來處理這些值而不會發生沖突。
In [21]: adict.update({i:True for i in range(100,106)})
In [22]: len(adict)
Out[22]: 106
In [23]: sys.getsizeof(adict)
Out[23]: 4696
In [24]: adict.update({i:True for i in range(106,112)})
In [25]: sys.getsizeof(adict)
Out[25]: 4696
對于總記憶體占用,我們還必須考慮鍵和值的記憶體使用。在這些示例中,這并不多,因為所有參考都True
參考同一個物件。最多 255 個整數也是預先分配的并且是唯一的。但鍵可以是字串、元組或更復雜的物件。并且值可以是一個物件,盡管將它們添加到串列或字典中確實會增加記憶體使用。它們是通過參考而不是值存盤的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/469293.html
標籤:python-3.x 字典 哈希图 蟒蛇
上一篇:基于元組值的嵌套字典的元組串列