python 64式 第49式 dict原始碼分析

2021-10-01 20:49:20 字數 2300 閱讀 5546

目標:

弄清楚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...