PythonTip >> 博文 >> python

Python源码剖析笔记----第二章:初识PyIntObject

liushulinle 2014-11-29 15:11:05 点击: 4141 | 收藏


1. python中的整数对象是不可变对象

2.PyIntObject在做数值运算时,首先会判断结果是否溢出,若不溢出,则返回新创建的结果对象;
否则自动调用精度更高的数值类型对应的操作。如:Int a, b ,  若a + b溢出,则自动调用Long的+操作,若仍然溢出,则调用更高精度的+操作,返回结果对象(可能不是Int了)

3.小整数对象池
由于PyIntObject是不可变对象,这意味着可以无限共享int对象。由于小整数会被频繁的使用(比如for, while操作),为了提高效率,python会对小整数对象进行缓存(否则将会频繁的malloc和free操作)。
这里的小整数默认的范围是[-5, 257),。想改变的话,只能在python源码中更改这一值,然后重新编译。小整数对象池中的整数对象,在python初始化时被全被创建,直至python停止运行才会被销毁。

4.大整数对象
小整数对象有一块专用的内存,用于完全缓存所有小整数。对于大整数(除小整数之外的所有整数),python则维护一块共享内存(通用整数对象池),本着谁需要谁使用的原则进行管理。

5.整数的创建过程
首先检查小整数对象池机制是否被激活,若激活则尝试使用小整数对象池;否则使用通用整数对象池。
如果小整数对象池激活,则检查创建的整数是不是小整数范围,若是,直接从小整数对象池中返回创建好的小整数对象;否则,使用通用整数对象池。

6.对用通用整数对象池中的整数对象,当其引用值为0时,python垃圾回收机制销毁该对象。需要注意的是,销毁的过程并不是将该空间free还给系统,而是将该空间挂载在通用整数对象池的空闲空间部分,等待下次创建整数时使用。

作者:liushulinle | 分类: python | 标签: python核心编程 python Python源码 | 阅读: 4141 | 发布于: 2014-11-29 15时 |