collections.deque:为什么q [9999]比q [-1]快?

时间:2019-10-23 16:00:00

标签: python cpython deque

如果我是一名编写此功能的程序员,我会将其实现为负数表示从右开始,正数表示从左开始,这将导致q [-1]比q [9999]快得多。

但是,由于将-1转换为从右到1步似乎比9999转换为从右到1步更耗时,所以为什么q [-1]慢于q [9999]?

谢谢

>>> q = collections.deque()
>>> q.extend(range(10000))
>>> %timeit q[-1]
50.7 ns ± 0.195 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
>>> %timeit q[9999]
40.5 ns ± 0.528 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

1 个答案:

答案 0 :(得分:4)

如果您在Python中实现__getitem__,则会收到调用方使用的任何索引,而无需进行修改。

但是,under the hoodcollections.deque实现了C API sequence protocol,而__getitem__的C API序列协议版本的工作方式也有所不同。如果您输入负数,Python会将序列的len添加到索引中,然后再传递给deque的项目检索实现。

对于q[-1]q[9999],双端队列接收的索引为9999,它必须决定是从左侧还是从右侧进行迭代以找到您要的元素。但是,q[-1]首先要有额外的开销层。