我应该使用Python deque还是列表作为堆栈?

我应该使用Python deque还是列表作为堆栈?,python,python-3.x,list,python-2.7,data-structures,Python,Python 3.x,List,Python 2.7,Data Structures,我想要一个可以用作堆栈的Python对象。使用deque或列表更好吗?我有少量元素还是大量元素会有区别吗?您的里程数可能会根据您的应用程序和精确的用例而有所不同,但在一般情况下,列表非常适合堆栈: append是O(1) pop()弹出() 对于这些操作,DEQUE也是O(1),但需要从标准库导入模块,对于随机访问,需要“O(n)”。不过,可以提出一个论点,除非是针对特定的应用程序,否则更倾向于使用普通列表 更正: 雷蒙德·赫廷格(Raymond Hettinger)是list和deque的C代

我想要一个可以用作堆栈的Python对象。使用deque或列表更好吗?我有少量元素还是大量元素会有区别吗?

您的里程数可能会根据您的应用程序和精确的用例而有所不同,但在一般情况下,列表非常适合堆栈:

append
是O(1)

pop()<代码>弹出()

对于这些操作,DEQUE也是O(1),但需要从标准库导入模块,对于随机访问,需要“O(n)”。不过,可以提出一个论点,除非是针对特定的应用程序,否则更倾向于使用普通列表

更正: 雷蒙德·赫廷格(Raymond Hettinger)是list和deque的C代码的主要作者,他认为deques的性能可能略优于list:deques的pop()操作似乎具有优势

In [1]: from collections import deque

In [2]: s = list(range(1000))      # range(1000) if python 2

In [3]: d = deque(s)

In [4]: s_append, s_pop = s.append, s.pop

In [5]: d_append, d_pop = d.append, d.pop

In [6]: %timeit s_pop(); s_append(None)
10000000 loops, best of 3: 115 ns per loop

In [7]: %timeit d_pop(); d_append(None)
10000000 loops, best of 3: 70.5 ns per loop
deques和list在性能方面的真正区别 它们是:

Deques对于appendleft()和popleft()具有O(1)速度,而列表具有 插入(0,值)和弹出(0)的O(n)性能。
列表附加 性能是偶然的,因为它在引擎盖下使用realloc()。 因此,在简单代码中,它的计时往往过于乐观 (因为realloc不需要移动数据)而且速度非常慢 实代码中的计时(因为碎片迫使realloc移动所有 数据)。相反,deque append性能是一致的,因为 它从不重新分配和移动数据


如果要对比两种解决方案,为什么要强调它们相同的部分?他们不是“可以论证的”O(1)和deque——他们是O(1)。假设的开销是多少?有什么基准来支持这一点吗?关于性能@Ryan,我得到了更正-我发布了一个勘误表。请注意,引用的帖子是由Python核心开发人员Raymond Hettinger撰写的,他是这两个和的C代码的主要作者,所以他知道他在说什么!我得到:
AttributeError:“range”对象没有属性“append”
我已经更新了答案@EduardoPignatelli,它在python 2中是正确的,当
range
返回一个
列表时。