Python对象 —— 整型对象
Python中的整数对象
PyIntObject
对象构造
- PythonObject对象分类:
- 按照对象长度是否可变分类
- 定长对象
- 变长对象
- 按照对象内参数是否可变分类
- 可变对象
- 不可变对象
- 按照对象长度是否可变分类
- 整数类型对象信息
- int_dealloc: 析构操作
- int_free:释放操作
- int_print:打印
- int_compare:比较
- int_repr:字符串转化
- int_as_number:数值操作集合
- PyIntObject对象所实现地加法操作是直接在其维护地long值上进行地
- 为了加快速度,Python为Int基类提供了一个宏方法,在整数类的属性上直接操作,调过来整数基类提供的安全配置
- int_hash:Hash转换
- int_methods:函数集合
PyIntObject对象地创建和维护
对象创建地途径
- PyInt_FromString
- 从字符串对象转化为浮点数,然后调用PyInt_FromFloat
- PyInt_FromLong
- PyInt_FromUnicode
- 从unicode对象转化为浮点数,然后调用PyInt_FromFloat
小整数对象会存入对象池中
- 默认小整数是5~257
- 对象池变量名:
small_ints - 修改NSMALLPOSINTS和NSMALLNEGINTS可以修改对象池的大小
大整数的内存空间
- Python运行环境会提供一块内存空间供大整数轮流使用
- 结构对象名:PyIntBlock
- 对象是一个单向列表,内部维护了一块内存(block)
N-INTO-BJECTS用于维护空间可存储对象数量- 对象通过
block_list维护,这是一个PyIntObject数组 - 因为使用单向列表存储,int对象被删除后存储空间不会被释放
- 为了利用所有地存储空间,Python使用单向链表
free_list来管理所有block中地空闲空间![]()
添加和删除整数对象
PyIntObject对象的创建过程:
- 方法名:
PyInt_FromLong - 判断是否为小整数,
- 是则去对象池中获取内存地址
- 否则使用通用对象池创建
- 获取内存空间获取空闲内存地址
- init对象
- 存入数据
- 如果内存空间满了,就会通过
fill_free_list方法来创建新的内存空间
- 如果内存空间满了,就会通过
Python对fill_free_list的调用不光会发生在对PyInt_FromLong的首次调用时,在Python运行期间,只要所有block的空闲内存都被使用完了,就会导致free_list变为NULL,从而在下一次PyInt_FromLong的调用时激发对fill_free_list的调用
-
申请一个新的
PyIntBlock结构![]()
-
从
free_list开始,沿着ob_type指针,就可以便遍历创建的PyIntBlock中的所有空闲的内存![]()
-
新创建的block必须加入到block_list维护到链表中
使用通用整数对象池
不同PyIntBlock对象到objects中的空闲内存块是被链接在一起的,形成了一个单向链表,指向表头的指针是free_list
销毁对象对应类型的方法:tp_dealloc
当一个对象被销毁时,它所占有的内存并不会释放,而是继续被Python保留为空闲内存,进入free_list维护的自由内存链表,被新的PyIntObject使用


- 整数对象存在大整数和小整数,小整数由于常用所以被存储在一个内存池中国呢,这个内存池在代码编译时创建
- 大整数会在创建时申请一个数组来存储
- 在整数对象的数量超过原来申请的内存数组的大小时,会通过
int_dealloc再申请一个数组,通过链表确认关系 - 当整数被回收时,内存地址会返回给
int_dealloc重新使用,而不是返回给系统
小整数对象池的初始化
方法:_PyInt_Init
在Python初始化时,_PyInt_Init被调用,内存被申请,小整数对象被创建
本文来自博客园,作者:lwxc,转载请注明原文链接:https://www.cnblogs.com/mars-zhz/articles/17555439.html



浙公网安备 33010602011771号