我们知道,python中的整数有一些特点:
- 无大小限制,也就是说不像Java,C++会有溢出的情况,当然python也会溢出,这和你的内存大小有关系
- 存储正/负数底层虽然是用补码,但是显示出来却是:bin(-3)='-0b11',很捞
Cpython中integer是怎么实现的呢?
PyIntObject结构:
typedef struct
{
PyObject_HEAD;
long ob_ival;
}PyIntObject;
为了避免每次需要一个新的整数对象时都分配一个新整数对象,python会预先分配一个空闲的未使用的整数对象块
python通过使用下面这个结构来分配整数对象(PyIntObject),这个结构称为PyIntBlock,初始化时,新的整数值分配给一个对象
PyIntBlock结构:
struct _intblock
{
struct _intblock *next;
PyIntObject objects[N_INTOBJECTS];
};
//取别名
typedef struct _intblock PyIntBlock;
当python分配一个整数对象块的时候,这些对象尚未分配任何值,我们称这些对象为随时准备使用的免费整数对象 ,当程序使用新的整数值时,将为下一个空闲对象分配一个值,当设置了自由整数对象的值时,不需要内存分配,所以速度快。可以看里面的结构:是一个整数对象的数组,只需要进行指针指向就行了,不需要重新分配内存。
Cpython中Integer对象的内存管理与实现

本文探讨了Python(Cpython)中Integer对象的实现细节,包括无大小限制的特点,以及如何避免每次创建新对象时的内存分配。Python通过PyIntObject和PyIntBlock结构管理整数对象,使用单链表跟踪分配的整数块,并且针对小整数(-5至256)进行了优化,以提高访问速度。当创建或访问超出小整数范围的整数时,Python会动态分配新的PyIntBlock。
最低0.47元/天 解锁文章
1372

被折叠的 条评论
为什么被折叠?



