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

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