用于实现Python内置列表数据类型的典型底层数据结构是什么?
答案 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个字节)并复制内容。