目標:
弄清楚python中dict的實現原理
1.1 原理
python的字典實際是雜湊表,通過雜湊函式將key對映到表中的位置來
儲存value。
存在不同物件經過雜湊函式得到的雜湊值可能相同,此時
採用開放定址法來解決衝突。
開放定址法通過二次探測函式f尋找下乙個候選位置,若位置可用,
則將資料插入。
使用二次探測函式f從乙個位置出發可以到達多個位置,這些位置形成了衝突探測鏈,
此時刪除鏈路上某個元素,採用標記法來進行邏輯刪除。
1.2 狀態
python字典的3種狀態
unused: 字典還未儲存鍵值對,初始化的字典都是該狀態
active: 字典儲存鍵值對時
dummy: 字典的鍵值對被刪除時,將key的狀態改為dummy。
主入口:
typedef struct pydictobject;
分析:2.1) 字典是乙個結構體,包含了:
ma_used,ma_keys,ma_values引數。
ma_used表示字典中鍵值對的個數,
ma_keys表示
ma_values如果不空,則keys儲存在ma_keys,values儲存在ma_values;否則
鍵值都儲存在ma_keys中。
2.2) 建立字典
呼叫pydict_new(void)
原始碼如下:
pyobject *
pydict_new(void)
分析:new_keys_object進行容量檢查和根據容量申請記憶體,具體參見2.2.1
new_dict建立字典,具體參見2.2.2
2.2.1) new_keys_object**如下
static pydictkeysobject *new_keys_object(py_ssize_t size)
else if (size <= 0xffff)
#if sizeof_void_p > 4
else if (size <= 0xffffffff)
#endif
else
if (size == pydict_minsize && numfreekeys > 0)
else
}dk_debug_incref dk->dk_refcnt = 1;
dk->dk_size = size;
dk->dk_usable = usable;
dk->dk_lookup = lookdict_unicode_nodummy;
dk->dk_nentries = 0;
memset(&dk->dk_indices.as_1[0], 0xff, es * size);
memset(dk_entries(dk), 0, sizeof(pydictkeyentry) * usable);
return dk;
}2.2.2) new_dict分析
原始碼如下:
new_dict(pydictkeysobject *keys, pyobject **values)
else
}mp->ma_keys = keys;
mp->ma_values = values;
mp->ma_used = 0;
mp->ma_version_tag = dict_next_version();
assert(_pydict_checkconsistency(mp));
return (pyobject *)mp;
}分析:
new_dict方法優先從快取中虎丘記憶體,如果沒有快取,則
呼叫pyobject_gc_new建立字典物件並初始化key和value
2.3 字典查詢
分析lookdict方法
原始碼如下:
static py_ssize_t _py_hot_function
lookdict(pydictobject *mp, pyobject *key,
py_hash_t hash, pyobject **value_addr)
if (ix >= 0)
if (ep->me_hash == hash)
if (dk == mp->ma_keys && ep->me_key == startkey)
}else }}
perturb >>= perturb_shift;
i = (i*5 + perturb + 1) & mask;
}py_unreachable();
}參考:
python 64式 第13式 執行緒
usr bin env python coding utf 8 import time import threading 關鍵 1 併發和並行 併發 交替處理多個任務的能力 關鍵在併發交替 並行 同時處理多個任務的能力 關鍵在並行同時 2 多程序與多執行緒 多程序可以充分使用多個cpu 多執行緒不能...
python 64式 第10式 深淺拷貝
usr bin env python coding utf 8 import copy 關鍵 1 深拷貝 拷貝了物件所有元素,包含巢狀元素。是與原來物件無關的全新物件。無關性。2 淺拷貝 建立新物件,但新物件中各個元素是原物件對應各個元素的引用。3 舉例如下 a 1,2,3 c copy.copy ...
python 64式 第6式 定時器
usr bin env python coding utf 8 import logging import sys from datetime import datetime from oslo config import cfg from oslo log import log from oslo...