从Python 源码来分析列表的Resize 机制 | Python list resize
Python列表底层是通过存储对象指针的变长数组来实现的,使用数组带来的好处就是可以通过索引随机访问列表中的元素。[[387994]][1]“resize是增加列表开销的重要因素。”Python列表底层是通过存储对象指针的变长数组来实现的,使用数组带来的好处就是可以通过索引随机访问列表中的元素。然而,由于list属于可变数据类型,我们可以动态地在list中增减元素,当底层数组不足以容纳新元素时,就要调整其大小了。这正是“变长”的含义所在。那么,list使用的变长数组是如何调整其大小呢?我们通过阅读Python源码来做下简单分析。【列表初始内存分...
Python 列表底层是通过存储对象指针的变长数组来实现的,使用数组带来的好处就是可以通过索引随机访问列表中的元素。
[[387994]][1]
“ resize 是增加列表开销的重要因素。”
Python 列表底层是通过存储对象指针的变长数组来实现的,使用数组带来的好处就是可以通过索引随机访问列表中的元素。
然而,由于 list 属于可变数据类型,我们可以动态地在 list 中增减元素,当底层数组不足以容纳新元素时,就要调整其大小了。这正是“变长”的含义所在。
那么,list 使用的变长数组是如何调整其大小呢?我们通过阅读 Python 源码来做下简单分析。
【列表初始内存分配机制】
先来了解一下,创建一个 list 时,list 底层数组是什么样子的。
list___init__() 是创建 list 对象的接口函数。它调用了 list___init___impl(self, iterable)。list___init___impl 接受一个 iterable 作为初始化源。这和我们通常初始化一个 list 对象的方式是一致的。
list___init___impl 做了哪些初始化工作呢?
list___init___impl() 首先将入参 self 指向的对象清空,原因是:Python 为提升创建 list 对象的效率,维护了一个 free_list 对象池。它可以回收不再使用的 list 对象,并重新分配给新 list 对象使用。
/* Empty list reuse scheme to save calls to malloc and free */ #ifndef PyList_MAXFREELIST # define PyList_MAXFREELIST 80 #endif static PyListObject *free_list[PyList_MAXFREELIST]; static int numfree = 0;这个 list 内存池的大小为 80.
如果 self 指向的是一个缓存池中的对象,则需要先将它...