4. int类型之小整数对象池

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;
}

你可能感兴趣的:(CPython2.7源码学习)