python 原始碼解析(一)
阿新 • • 發佈:2018-12-23
為了看懂 python 原始碼 ,特地學了 c++ ,依然看不懂,看了個大概,先留個坑,慢慢填。
先從 python dict 物件開始看起。
python dict 物件 是鍵值對的 一種結構,類似於 java 的hashmap 物件。
dictd 物件 , 每個鍵值對 ,被 c 的 struct 結構定義,兩個指標,一個指向key ,另一個 指向value.
typedef struct { long me_hash; PyObject *me_key; PyObject *me_value; #ifdef USE_CACHE_ALIGNED long aligner; #endif } dictentry
而 定義字典得 struct 是這樣的。
struct dictobject {
PyObject_HEAD
int ma_fill;
int ma_used;
int ma_size;
int ma_poly;
dictentry *ma_table;
dictentry *(*ma_lookup)(dictobject *mp, PyObject *key, long hash);
};
dictentry *ma_table; 是一個 dictentry 的 指標。
而 字典 是 採用開放定址法,dict 建立過程,mp->ma_size = 0;
mp->ma_poly = 0;
mp->ma_table = NULL;
mp->ma_fill = 0;
mp->ma_used = 0;
分別用 ma_size ma_table 等幾個 欄位 記錄狀態。這是 ma_table 為 null , 表明 字典 裡還沒有鍵值對。
yDict_New(void) { register dictobject *mp; if (dummy == NULL) { /* Auto-initialize dummy */ dummy = PyString_FromString("<dummy key>"); if (dummy == NULL) return NULL; #ifdef SHOW_CONVERSION_COUNTS Py_AtExit(show_counts); #endif } mp = PyObject_NEW(dictobject, &PyDict_Type); if (mp == NULL) return NULL; mp->ma_size = 0; mp->ma_poly = 0; mp->ma_table = NULL; mp->ma_fill = 0; mp->ma_used = 0; mp->ma_lookup = lookdict_string; #ifdef SHOW_CONVERSION_COUNTS ++created; #endif PyObject_GC_Init(mp); return (PyObject *)mp; }
太晚了 頭暈 ,明天再說。