2017-09-03 48 views
0

我陷在Python中dict結構,我想了解緊湊字典的執行情況,更快的迭代解釋這裏[Python-Dev] More compact dictionaries with faster iteration by Raymond HettingerPython的緊湊詞典查找是如何執行的,int值是否在指示符內?

在此消息,雷蒙德會顯示當前字典的實現是和它如何能更高效地存儲內存。他描繪字典結構是這樣的:

d = {'timmy': 'red', 'barry': 'green', 'guido': 'blue'} 

目前存儲爲:

entries = [['--', '--', '--'], 
      [-8522787127447073495, 'barry', 'green'], 
      ['--', '--', '--'], 
      ['--', '--', '--'], 
      ['--', '--', '--'], 
      [-9092791511155847987, 'timmy', 'red'], 
      ['--', '--', '--'], 
      [-6480567542315338377, 'guido', 'blue']] 

相反,數據應該被安排如下:

indices = [None, 1, None, None, None, 0, None, 2] 
entries = [[-9092791511155847987, 'timmy', 'red'], 
      [-8522787127447073495, 'barry', 'green'], 
      [-6480567542315338377, 'guido', 'blue']] 

我的問題是如果索引數據是數字0,1,2,輸入項目時,新字典實現如何執行查找,? 只是爲了清楚,實際值是不同的(例如密鑰的散列值)?

一些參考我已經看了Dictionaries are ordered in Python 3.6+

+1

有一個鏈接到該網頁上包含的食譜,你應該考慮看看它:http://code.activestate.com/recipes/578375/ –

+0

我其實看過它,謝謝你的建議我會深入研究它 – Vinny

回答

0

做更多的研究,我已經找到了答案,我去找。

Python的常規詞典在數組中分配了24個字節索引(PyDictEntry)。 Python 2.7中的空字典消耗

d = dict() 
import sys 
sys.getsizeof(d) 
272 

(8 * 24 = 192 +開銷)。這就是從源代碼中的字典條目對象:

typedef struct { 
    /* Cached hash code of me_key. Note that hash codes are C longs. 
    * We have to use Py_ssize_t instead because dict_popitem() abuses 
    * me_hash to hold a search finger. 
    */ 
    Py_ssize_t me_hash; --> 8 bytes 
    PyObject *me_key; --> 8 bytes 
    PyObject *me_value; --> 8 bytes 
} PyDictEntry; 

隨着新緊湊字典,該表分爲兩種:指標和條目。 索引數組是int類型(對於空到小字典),它是8字節。這些是對條目實際索引的引用,如果有的話。如果它爲空,則返回None(如果有刪除,則返回假)。然後條目列表只包含分配的對象。

使用我的例子,在Python 3.6中有3個條目的字典會消耗:索引(8字節)+條目(3 * 24 = 72)= 80字節+開銷。

這對於相同的數據非常節省,對性能影響很小甚至沒有影響。

當執行查找時,它會在索引表中查找。然後它使用返回值讀取/追加一個條目條目列表。