Python 源码剖析 - Hack PyListObject

发布于 2023-01-12 21:09:38 字数 1214 浏览 130 评论 0

首先我们来观察在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

ぃ双果

暂无简介

文章
评论
29 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文