在 Python编程访谈元素一书中的 Arrays 一章中,提到从前面填充数组很慢,所以请参阅如果可以从后面写入值。
可能的原因是什么?
答案 0 :(得分:2)
Python列表,至少在CPython中,标准Python实现are actually implemented from a data structure perspective as arrays, not lists。
但是,这些是动态分配和调整大小的,因此实际上可以附加到Python列表的末尾。这需要花费一些可变的时间:CPython尝试在项目被追加超出实际需要的时间时分配额外的空间,这样它就不需要为每个追加操作分配更多的空间。最好,如果已经分配了空间,则追加是O(1),并且因为它是一个数组,所以索引也是O(1)。
需要花费很长时间才会在列表的开头添加内容,因为这需要移动所有数组值,并is O(n), just as popping the first element is。
Python语言设计者决定调用这些数组列表而不是数组,这与标准术语相矛盾,部分原因,我认为,因为动态调整大小使它们与标准的固定大小列表不同。
除非我弄错了,collections.deque实现了一个双向链接列表,相应的O(1)在任一侧附加/弹出,依此类推。