python 整型對象 底層實現 源碼分析 PyLongObject(int)

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,以此來提高效率

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章