一些答案声称双端队列与列表使用作为 FIFO 的速度优势为“10 倍”,但两者都有 1000 个条目,但这有点过高:
$ python -mtimeit -s'q=range(1000)' 'q.append(23); q.pop(0)'
1000000 loops, best of 3: 1.24 usec per loop
$ python -mtimeit -s'import collections; q=collections.deque(range(1000))' 'q.append(23); q.popleft()'
1000000 loops, best of 3: 0.573 usec per loop
python -mtimeit
是你的朋友——一种非常有用且简单的微基准测试方法!有了它,您当然也可以在更小的情况下轻松探索性能:
$ python -mtimeit -s'q=range(100)' 'q.append(23); q.pop(0)'
1000000 loops, best of 3: 0.972 usec per loop
$ python -mtimeit -s'import collections; q=collections.deque(range(100))' 'q.append(23); q.popleft()'
1000000 loops, best of 3: 0.576 usec per loop
(顺便说一句,12 个而不是 100 个项目差别不大),以及更大的项目:
$ python -mtimeit -s'q=range(10000)' 'q.append(23); q.pop(0)'
100000 loops, best of 3: 5.81 usec per loop
$ python -mtimeit -s'import collections; q=collections.deque(range(10000))' 'q.append(23); q.popleft()'
1000000 loops, best of 3: 0.574 usec per loop
您可以看到,关于双端队列的 O(1) 性能的说法是有根据的,而列表在 1,000 项左右的速度是两倍多,大约 10,000 个数量级。您还可以看到,即使在这种情况下,每个附加/弹出对仅浪费 5 微秒左右,并确定这种浪费的严重程度(尽管如果这就是您对该容器所做的全部,那么 deque 没有缺点,所以您即使 5 微秒或多或少不会产生重要影响,也可以切换)。