Python 源码阅读 —— int

========================== 

代码我也仅仅是粗粗读了一遍, 可能出现疏漏和理解错误, 发现了望指出哈.

今天面了一家靠谱的创业公司, 可惜不是Python向的, 想继续玩Python是有代价的, 选择余地太窄了……

话说写文章很耗时间, 这个花了两个多小时….主要还是自个绘图渣效率低:(

准备找工作事宜很占时间, 后面只能慢慢来了(好像还很多很多的样子)


示例

源码位置 Include/intobject.h |
Objects/intobject.c


PyIntObject

结构

PyIntObject


几个构造方法

这几个方法, 只需要关注


具体的构造方法 PyInt_FromLong

这个方法的定义

注意这里的Py_TYPE()方法, 在我们第一篇文章里面有提到, 不知道的回去复习下对象的数据结构

简而言之:


小整数对象池

先看定义

其实, 小整数对象池就是一个PyIntObject指针数组(注意是指针数组), 大小=257+5=262, 范围是[-5, 257) 注意左闭右开. 即这个数组包含了262个指向PyIntObject的指针.

结构

small_ints

创建整数时, 如果在[-5, 257)范围, 直接返回已经存在的整数对象指针, 所以我们看到开头的例子, id比较一个true/一个false

小整数对象池, 在一开始就初始化了, 其初始化代码

代码很眼熟吧, 觉得不眼熟回上面看代码

结论


通用整数对象池1 – 基础结构PyIntBlock

首先, 有个数据结构PyIntBlock

回忆一下PyIntObject结构(1个int, 1指针, 1个long), size=4+4+4(先这么算), N_INTOBJECTS = 82

结构

PyIntBlock

通用整数对象池2 – 创建过程及运行时结构

有两个指针

生成过程的定义

新建第一个时, 只有一个

PyIntBlock

从里面拿整数时, 取free_list指向的节点, 然后free_list指向链表下一个节点

当一个block用完了之后, 即free_list=NULL, 此时要新建另一个PyIntBlock

新建第二个

PyIntBlock

通用整数对象池3 – 删除一个整数时

定义

可以看到, 回收的时候, 把空间给放回到free_list了, 后面接着用

block_list维护着所有PyIntBlock列表, 查看源码注释可以看到

即, PyIntBlock申请的所有内存, 在Python结束之前, 都不会被释放


changelog

打赏支持我写出更多好文章,谢谢!

打赏作者

打赏支持我写出更多好文章,谢谢!

任选一种支付方式

2 2 收藏 评论

关于作者:wklken

Pythonista/vimer 个人主页 · 我的文章 · 37 ·   

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部