Python 源码剖析 - Hack PyListObject
首先我们来观察在 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 对象时,确实将这个对象放到了缓冲池中。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论