python原始碼剖析 筆記2

2021-09-24 19:07:47 字數 1837 閱讀 2243

pystringobject物件

typedef struct  pystringobject;
頭部儲存乙個ob_size,表示字串在記憶體中的具體長度,字串由ob_sval指標指向,但是,字串的最後一位也一定是』\0』結束,由於有ob_size的標記,允許字串中間也有』\0』字元的存在。

字串的型別物件中,tp_itemsize設定為sizeof(char),這個值表示變長物件中每個元素單位的長度,每乙個python中的變長物件(string、list等),都需要在對應的型別物件中設定tp_itemsize的值。tp_itemsize和ob_size共同決定了乙個物件需要在記憶體中實際占用的空間大小。

對於空字串,python會返回其內部的nullstring物件,避免每次都建立,這個物件相當於是共享的。

intern機制。為了避免每次為相同的字串開創新物件,可以利用intern機制來實現。相當於建立時會先查詢是否有使用了intern機制建立的物件,包含的字串和待建立的一樣,如果存在,則直接返回該物件的引用,而不用再次建立乙個全新的物件。

interned的實現,實際上是維護了乙個map的字典集合,key,value都是那個採用interned機制的py物件指標,如果在這個map中找到乙個物件的字串內容和待建立的一致,則直接把待建立的指標指向這個map的value。加入map時,按照py的引用計數規則,對應的物件引用計數會先+1,相當於這個物件引用+2了,這樣的話,這種物件實際不可能出現引用為0的情況,所有,對於加入到interned中的物件,會在加入完畢後執行引用計數-2的操作。

對於單個字元的,也有乙個靜態緩衝區,類似pyintobject對小整數的處理。

pylistobject類似於c++中的vector

結構定義:

typedef struct  pylistobject;
一次分配的記憶體是大於現實需要的記憶體,類似vector的記憶體分配策略。

0 <= ob_size <= allocated;

len(list) == ob_size

pylist的物件緩衝池。在每個pylist被銷毀的那會,會檢測free_list這個緩衝池是否滿了,如果沒滿,則會把當前這個待銷毀的物件放入這個緩衝池中。當然,這個list內部的元素item都是要被free掉記憶體的,不然就是一堆野指標了。只是這個物件的記憶體空間會被快取下來,避免下次的再次申請記憶體導致額外的消耗。

pydictobject底層採用hash_table來儲存,hash衝突利用開放位址法來解決(lookdict方法來搜尋元素)。

dict裡面每個pair對都是乙個pydictentry

typedef struct  pydictentry;
每個dict內部都有乙個pydictentry的小規模陣列(預設8),當dict的size小於8時,內部標識的ma_table指標就指向這個小陣列,如果大於8,則申請一塊大記憶體,ma_table指向那塊記憶體。me_key有三種狀態,dummy、unused和實際有效使用的active。刪除元素後會變成dummy狀態,freeslot指標會指向該位置,freeslot在下次插入新元素時會使用到。

搜尋時根據hash值查詢,如果查到的key和待搜尋的不同,則根據lookdict二次探測。

dict每次的插入,會呼叫pydict_setitem,在這裡面會先計算hash值,hash = pyobject_hash(pyobject*)。在最後,會根據裝載率來決定當前ma_table指向的記憶體是否需要擴容,因為裝載率高了,hash衝突的概率就會加大。

pydict使用的緩衝池技術和int這些類似,都是在乙個object銷毀時加入到緩衝池中。

python原始碼剖析 Python原始碼剖析

第頁共 頁python 原始碼剖析 物件機制 1.物件 在python 的世界中,一切都是物件,乙個整數是乙個物件,乙個字串也是 乙個物件,更為奇妙的是,型別也是乙個物件,整數型別是乙個物件,字串類 型也是乙個物件。從 年guido 在那個聖誕節揭開 python 世界的大幕開始,一直到現在,pyt...

python原始碼剖析筆記(一)

define pyobject head pyobject head extra py ssize t ob refcnt struct typeobject ob type define pyobject var head pyobject head py ssize t ob size numb...

express原始碼剖析2

使用express時,會這樣寫 var express require express 建立乙個express的應用,express.js return api public function req,res,next false false return 在express.js中,要區分下面兩個包...