PyLongObject
本文參考的是 3.8.0a0 版本的代碼,詳見 cpython 源碼分析 基本篇
以後都在 github 更新,請參考 圖解python int
在當前的版本中,cpython只有 long 和 float 兩個類型來保存數字,一個保存整數,一個保存浮點數,而用來保存整數的這裏叫做 PyLongObject,他是一個容器對象,我們來看下他的 memory layout
PyObject_VAR_HEAD 表示 longObject 是一個容器對象
digit ob_digit[1] 則是對應的容器,也就是一個列表,裏面的每個元素都是 digit,這個 digit 類型在marco PYLONG_BITS_IN_DIGIT == 30 的時候爲 unit32,在 PYLONG_BITS_IN_DIGIT == 15 時類型爲 unsigned short
整型存儲方式
之前寫的有些問題,想了解詳情請參考 圖解python int
small_ints
如 tupleObject/listObject/setObject python 引入 free_list 來保存一部分較小的變量,當某個佔用空間較小的對應的變量需要被垃圾回收時,直接儲存回 free_list 以供下次使用,避免了頻繁的向操作系統 malloc/free 申請/釋放空間,這裏也引入了一個 small_ints 的概念,small_ints 存儲的是 -5 到正 257 這 262 個整數,只要是在這個範圍內部的整數,整個解釋器的生命週期只有一個與之對應的 PyLongObject,以此來提高效率