Python 原始碼閱讀 —— int

wklken發表於2015-11-27
========================== 

程式碼我也僅僅是粗粗讀了一遍, 可能出現疏漏和理解錯誤, 發現瞭望指出哈.

今天面了一家靠譜的創業公司, 可惜不是Python向的, 想繼續玩Python是有代價的, 選擇餘地太窄了……

話說寫文章很耗時間, 這個花了兩個多小時….主要還是自個繪圖渣效率低:(

準備找工作事宜很佔時間, 後面只能慢慢來了(好像還很多很多的樣子)


示例

原始碼位置 Include/intobject.h |
Objects/intobject.c


PyIntObject

結構

PyIntObject


幾個構造方法

這幾個方法, 只需要關注


具體的構造方法 PyInt_FromLong

這個方法的定義

注意這裡的Py_TYPE()方法, 在我們第一篇文章裡面有提到, 不知道的回去複習下物件的資料結構

簡而言之:


小整數物件池

先看定義

其實, 小整數物件池就是一個PyIntObject指標陣列(注意是指標陣列), 大小=257+5=262, 範圍是[-5, 257) 注意左閉右開. 即這個陣列包含了262個指向PyIntObject的指標.

結構

small_ints

建立整數時, 如果在[-5, 257)範圍, 直接返回已經存在的整數物件指標, 所以我們看到開頭的例子, id比較一個true/一個false

小整數物件池, 在一開始就初始化了, 其初始化程式碼

程式碼很眼熟吧, 覺得不眼熟回上面看程式碼

結論


通用整數物件池1 – 基礎結構PyIntBlock

首先, 有個資料結構PyIntBlock

回憶一下PyIntObject結構(1個int, 1指標, 1個long), size=4+4+4(先這麼算), N_INTOBJECTS = 82

結構

PyIntBlock

通用整數物件池2 – 建立過程及執行時結構

有兩個指標

生成過程的定義

新建第一個時, 只有一個

PyIntBlock

從裡面拿整數時, 取free_list指向的節點, 然後free_list指向連結串列下一個節點

當一個block用完了之後, 即free_list=NULL, 此時要新建另一個PyIntBlock

新建第二個

PyIntBlock

通用整數物件池3 – 刪除一個整數時

定義

可以看到, 回收的時候, 把空間給放回到free_list了, 後面接著用

block_list維護著所有PyIntBlock列表, 檢視原始碼註釋可以看到

即, PyIntBlock申請的所有記憶體, 在Python結束之前, 都不會被釋放


changelog

打賞支援我寫出更多好文章,謝謝!

打賞作者

打賞支援我寫出更多好文章,謝謝!

任選一種支付方式

Python 原始碼閱讀 —— int Python 原始碼閱讀 —— int

相關文章