如果我是编写这个功能的程序员,我会把它实现为从右开始的负平均值,从左开始的正平均值,这将导致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)
最佳答案
如果在Python中实现__getitem__
,则可以接收调用方使用的任何索引,而无需修改。
然而,under the hood,collections.deque
实现了c-apisequence protocol,而c-api序列协议版本的工作方式不同。如果传入一个负数,python将把序列的__getitem__
添加到索引中,然后再将其传递到len
的项检索实现中。
对于deque
和q[-1]
,deque接收的索引是q[9999]
,它必须决定是从左侧还是右侧迭代以找到所需的元素。然而,9999
首先有一个额外的开销层。
关于python - collections.deque:为什么q [9999]比q [-1]快?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58526885/