为了账号安全,请及时绑定邮箱和手机立即绑定

Python的列表是如何实现的?

Python的列表是如何实现的?

收到一只叮咚 2019-07-09 10:46:08
Python的列表是如何实现的?是链表还是数组?我四处搜寻,只发现有人在猜测。我的C知识还不够好,不能看源代码。
查看完整描述

3 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

是个动态阵列..实际证明:索引使用(当然,与极小的差异(0.0013!)同时,无论索引是什么:

...>python -m timeit --setup="x = [None]*1000" "x[500]"10000000 loops, best of 3: 0.0579 usec per loop...>
python -m timeit --setup="x = [None]*1000" "x[0]"10000000 loops, best of 3: 0.0566 usec per loop

如果IronPython或Jython使用链接列表(它们会破坏许多被广泛使用的库的性能),我会感到惊讶,因为它们假设列表是动态数组。


查看完整回答
反对 回复 2019-07-09
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

实际上,C代码非常简单。扩展一个宏并删除一些不相关的注释,基本结构在listobject.h,它将列表定义为:

typedef struct {
    PyObject_HEAD
    Py_ssize_t ob_size;

    /* Vector of pointers to list elements.  list[0] is ob_item[0], etc. */
    PyObject **ob_item;

    /* ob_item contains space for 'allocated' elements.  The number
     * currently in use is ob_size.
     * Invariants:
     *     0 <= ob_size <= allocated
     *     len(list) == ob_size
     *     ob_item == NULL implies ob_size == allocated == 0
     */
    Py_ssize_t allocated;} PyListObject;

PyObject_HEAD包含引用计数和类型标识符。因此,它是一个过分配的向量/数组。当数组满时调整大小的代码在listobject.c..它实际上并不是数组的两倍,而是通过分配

new_allocated = (newsize >> 3) + (newsize < 9 ? 3 : 6);new_allocated += newsize;

每一次,newsize请求的大小(不一定)allocated + 1因为你可以extend由任意数目的元素代替append一个接一个地给他们看)。

另见Python常见问题.


查看完整回答
反对 回复 2019-07-09
?
当年话下

TA贡献1890条经验 获得超9个赞

在CPython中,列表是指针数组。Python的其他实现可以选择以不同的方式存储它们。


查看完整回答
反对 回复 2019-07-09
  • 3 回答
  • 0 关注
  • 660 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信