Python列表的基础数据结构是什么?

时间:2009-05-27 06:22:56

标签: python list data-structures

用于实现Python内置列表数据类型的典型底层数据结构是什么?

4 个答案:

答案 0 :(得分:47)

  

列表对象实现为   阵列。它们针对快速进行了优化   固定长度操作并产生O(n)   pop(0)和pop的内存移动成本   插入(0,v)更改的操作   的大小和位置   基础数据表示。

另见: http://docs.python.org/library/collections.html#collections.deque

顺便说一句,我觉得有趣的是,关于数据结构的Python教程建议使用pop(0)来模拟队列,但是没有提到O(n)或deque选项。

http://docs.python.org/tutorial/datastructures.html#using-lists-as-queues

答案 1 :(得分:23)

CPython的:

typedef struct {
    PyObject_VAR_HEAD
    /* 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
     * list.sort() temporarily sets allocated to -1 to detect mutations.
     *
     * Items must normally not be NULL, except during construction when
     * the list is not yet visible outside the function that builds it.
     */
    Py_ssize_t allocated;
} PyListObject;

从下一行可以看出,该列表被声明为指向PyObjects的指针数组。

PyObject **ob_item;

答案 2 :(得分:9)

Jython implementation中,它是ArrayList<PyObject>

答案 3 :(得分:0)

尽管可能很明显,但值得指出的是Python列表是Dynamic数组(与Static数组相反)。这是面试问题/学术不足中的一个重要区别。

由于数组是动态的,因此Python在声明时会保留大量内存,例如:

somelist = []

因为已经预留了额外的内存,执行somelist.append()只会写入下一个保留的内存插槽,因此大多数时候是O(1)。对于静态数组,通常该数组已满(即,如果有4个字节,则数组大小为4),并且追加将始终为O(n),因为它们需要保留全新的内存集(现在可能是5个字节)并复制内容。