Python假设小整数的使用频率非常高,所以使用对象池来避免小整数使用时频繁的创建工作。
在Python初始化时,就会对这个小整数对象池进行初始化工作,具体就是创建小整数对应的对象。
由于内存有限,故而不可能创建很多的小整数对象,所以需要定义小整数的范围,目前是-5到256,我们可以根据具体应用场景对此进行修改,然后重新编译Python解释器。
/* intobject.c */
#ifndef NSMALLPOSINTS
#define NSMALLPOSINTS 257 // 小整数的上限, 256
#endif
#ifndef NSMALLNEGINTS
#define NSMALLNEGINTS 5 // 小整数的下限, -5
#endif
#if NSMALLNEGINTS + NSMALLPOSINTS > 0
static PyIntObject *small_ints[NSMALLNEGINTS + NSMALLPOSINTS]; // 小整数对象池, 本质就是一个存放PyIntObject指针的数组
#endif
/* PyInt模块的初始化工作,
* 这里就是对小整数对象池进行初始化
*/
int _PyInt_Init(void)
{
PyIntObject *v;
int ival;
#if NSMALLNEGINTS + NSMALLPOSINTS > 0
for (ival = -NSMALLNEGINTS; ival < NSMALLPOSINTS; ival++) {
if (!free_list && (free_list = fill_free_list()) == NULL)
return 0;
v = free_list;
free_list = (PyIntObject *)Py_TYPE(v);
(void)PyObject_INIT(v, &PyInt_Type);
v->ob_ival = ival;
// ival对应的小整数对象池的索引为ival + NSMALLNEGINTS
// -5为0, 256为261
small_ints[ival + NSMALLNEGINTS] = v;
}
#endif
return 1;
}