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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值