为什么Python列表实现为动态数组而不是环形缓冲区?

时间:2017-02-20 16:12:24

标签: python list data-structures language-design python-internals

Python中的list现在被实现为动态指针数组,因此它不适合在前端插入和删除。但是,ring buffer也支持O(1)索引。它也可以像动态数组一样扩展和收缩,以支持两端的O(1)摊销插入和删除。为什么CPython没有选择这个实现,或者它的主要缺点是什么?

1 个答案:

答案 0 :(得分:0)

使用环形缓冲区,除非开始位置恰好在索引0处,否则每次访问都需要进行一些索引转换。但是即使如此,您也必须检查开始位置是否为0。 >

O(1)仅表示工序具有固定成本,但没有告诉您固定成本是高还是低。对于动态数组,按索引访问元素的成本尽可能低:检查范围,然后访问该项。

有关该主题的Python FAQ并未讨论其他实现技术,但确实提到了通过索引访问元素作为优化目标: https://docs.python.org/3/faq/design.html#how-are-lists-implemented-in-cpython