Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python collections.deque:为什么q[9999]比q[-1]快?_Python_Cpython_Deque - Fatal编程技术网

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

Python collections.deque:为什么q[9999]比q[-1]快?,python,cpython,deque,Python,Cpython,Deque,如果我是编写此功能的程序员,我会将其实现为负表示从右开始,正表示从左开始,这将导致q[-1]比q[9999]快得多 然而,由于从右侧将-1转换为1步似乎并不比从右侧将9999转换为1步花费更多的时间,那么为什么q[-1]比q[9999]慢呢 谢谢 q=collections.deque() >>>q.extend(范围(10000)) >>>%timeit q[-1] 每个回路50.7纳秒±0.195纳秒(7次运行的平均值±标准偏差,每个10000000个回路) >>>%timeit q[999

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

然而,由于从右侧将-1转换为1步似乎并不比从右侧将9999转换为1步花费更多的时间,那么为什么q[-1]比q[9999]慢呢

谢谢

q=collections.deque() >>>q.extend(范围(10000)) >>>%timeit q[-1] 每个回路50.7纳秒±0.195纳秒(7次运行的平均值±标准偏差,每个10000000个回路) >>>%timeit q[9999] 每个回路40.5纳秒±0.528纳秒(7次运行的平均值±标准偏差,每个10000000个回路)
如果在Python中实现
\uuu getitem\uuuu
,则会收到调用者使用的任何索引,无需修改

但是,
collections.deque
实现了C API,而
\uuu getitem\uuu
的C API序列协议版本的工作方式不同。如果传入负数,Python将把序列的
len
添加到索引中,然后再将其传递给
deque
的项检索实现


对于
q[-1]
q[9999]
,deque接收的索引是
9999
,它必须决定是从左侧还是从右侧迭代以查找您请求的元素。然而,
q[-1]
首先有一层额外的开销。

由于两者都将使用
BINARY\u SUBSCR
操作码,有没有办法在不读取源代码的情况下获得负索引的中间步骤的提示?@heemayl:如果C类型支持切片,或使用除单个整数以外的任何其他内容进行索引,然后它必须实现映射协议版本的
\uuu getitem\uuu
,该版本没有此索引转换。如果它只支持整数索引,那么它可能使用序列协议。不过,我不认为有任何完全通用的方法可以确保不阅读源代码或直接调用C API(您可以使用ctypes)。(同样,在Python2上,序列协议支持基本的2-arg切片,因此在Python2上,基本切片支持不排除序列协议。)