整数对象池
Python 的内建对象存放在源代码的Objects
目录下。intobject.c
用于整数对象
在 Python 中,整数分为小整数对象
和大整数对象
小整数对象
由于数值较小的整数对象在内存中会很频繁地使用,如果每次都向内存申请空间、请求释放,会严重影响 Python 的性能。好在 整数对象 属于不可变对象,可以被共享而不会被修改导致问题,所以为 小整数对象 划定一个范围,即小整数对象池,在Python运行时初始化并创建范围内的所有整数,这个范围内的 整数对象是被共享的,即一次创建,多次共享引用。
那么这个范围是多少呢?从源文件中可以看到,而且,用户可以自行调整,只是每次都要在源文件中修改,而后进行编译、安装。
小整数池的范围:
#ifndef NSMALLPOSINTS
#define NSMALLPOSINTS 257
#endif
#ifndef NSMALLNEGINTS
#define NSMALLNEGINTS 5
#endif
#if NSMALLNEGINTS + NSMALLPOSINTS > 0
/* References to small integers are saved in this array so that they
can be shared.
The integers that are saved are those in the range
-NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive).
*/
static PyIntObject *small_ints[NSMALLNEGINTS + NSMALLPOSINTS];
从源代码可以看出define NSMALLPOSINTS 257
,范围的右边界define NSMALLNEGINTS 5
,范围的左边界-NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive)
,[-5, 257)
https://github.com/python/cpython/blob/2.7/Objects/intobject.c#L67-L80