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对象地创建和维护

对象创建地途径

  1. PyInt_FromString
    • 从字符串对象转化为浮点数,然后调用PyInt_FromFloat
  2. PyInt_FromLong
  3. 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的调用

  1. 申请一个新的PyIntBlock结构

  2. free_list开始,沿着ob_type指针,就可以便遍历创建的PyIntBlock中的所有空闲的内存

  3. 新创建的block必须加入到block_list维护到链表中

使用通用整数对象池

不同PyIntBlock对象到objects中的空闲内存块是被链接在一起的,形成了一个单向链表,指向表头的指针是free_list

销毁对象对应类型的方法:tp_dealloc

当一个对象被销毁时,它所占有的内存并不会释放,而是继续被Python保留为空闲内存,进入free_list维护的自由内存链表,被新的PyIntObject使用

  • 整数对象存在大整数和小整数,小整数由于常用所以被存储在一个内存池中国呢,这个内存池在代码编译时创建
  • 大整数会在创建时申请一个数组来存储
  • 在整数对象的数量超过原来申请的内存数组的大小时,会通过int_dealloc再申请一个数组,通过链表确认关系
  • 当整数被回收时,内存地址会返回给int_dealloc重新使用,而不是返回给系统

小整数对象池的初始化

方法:_PyInt_Init

在Python初始化时,_PyInt_Init被调用,内存被申请,小整数对象被创建

posted on 2023-07-15 02:35  lwxc  阅读(68)  评论(0)    收藏  举报