您当前的位置:首页 > 计算机 > 编程开发 > Python

Python 源码剖析 - Hack PyListObject

时间:12-14来源:作者:点击数:

首先我们来观察在 PyListObject 中维护的元素数量变化时,PyListObject 中 ob_size 和 allocated 两个变量的变化情况,从中窥见 PyListObject 对内存的使用和管理。

在 PyListObject 的输出操作 list_print 中,我们添加了如下代码,以观察 PyListObject 对内存的管理:

printf("\nallocated=%d, ob_size=%d\n", op->allocated, op->ob_size); 

观察结果如图9所示:

首先创建一个包含一个元素的list,这时ob_size和allocated都是1。这时list中拥有的所有内存空间都已被使用完,所以下次插入元素时就一定会调整list的内存空间了。

随后向list末尾追加元素2,可以看到,调整内存空间的动作发生了。

allocated 变成了 5,而 ob_size 则变成了2,这里明确地显示出了 PyListObject 所采用的与 C++ 中 vector 一样的内存缓冲池策略。

继续向list末尾追加元素 3,4,5,当追加了元素5之后,list所拥有的内存空间又被使用完了,下一次再追加或插入元素时,内存空间调整的动作又会再一次发生。

如果这时在list中删除元素3,可以看到,ob_size 发生了变化,而 allocated 则不发生变化,它始终如一地维护着当前list所拥有的全部内存数量。

接下来我们从图10的结果中观察一下 PyListObject 对象的创建和删除对于 Python 维护的 PyListObject 对象缓冲池的影响。

这次为了消除 Python 交互环境执行时对 PyListObject 对象缓冲池的影响,我们通过执行 py 脚本文件来观察,可以看到,当创建新的 PyListObject 对象时,如果缓冲池中有可用的 PyListObject 对象,则会使用缓冲池中的对象;而在销毁一个 PyListObject 对象时,确实将这个对象放到了缓冲池中。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐