首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从小整数对象池切入对C语言源码的理解

先看一个现象

类似这种让人confuse的现象有很多,如果单从概念上想说明白这事将非常困难,我们得从Python实现这种机制的源代码上来着手,要知道Python底层是通过C语言来实现的,而Python的C语言源代码不在安装包中,但可以从官网https://www.python.org/下载到

我们可以将下载的包解压到C盘查看里面的源代码文件

我们可以查看Include\intobject.h中对整型的实现代码

Python中对整数的实现都是通过PyIntObject来完成的,在Python2中整数对象PyIntObject是对C语言中long类型的包装,可以查看Objects\intobject.c中PyIntObject存储的元信息的代码

再查看Objects\intobject.c中定义小整数对象池的源码

小整数对象池的范围是-5到256,这是Python通过指针small_ints来减少小整数频繁分配内存的时间开销,所以就能解释图一中的现象,也就是说图一中如果实例化了一个整数在-5到256之间的数(包括-5和256)赋值的变量都将是同一个地址引用,下面的演示可以验证这个结果

具体为什么小整数对象池分配在这个区间笔者也不是很明白,但是你可以修改这个区间编译一个自己的Python版本使用,当然存在即有它的道理,不要轻易去修改前人铺好的路,作为学习理解是可以的。

那么对于大整数呢?试想如果将所有的整数对应的PyIntObject对象都缓存到内存池中,这是很理想的一种状态,但这样去使用内存合理吗?不合理,所以就要在鱼和熊掌之间取其一,大整数对象Python给出的策略是重新开辟内存空间,查看Objects\intobject.c中给大数据对象提供的轮流使用的策略

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180113G0GJVK00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券