哪个更好:双端队列或列表切片?

Which is better: deque or list slicing?

如果我用代码

from collections import deque
q = deque(maxlen=2)
while step <= step_max:
    calculate(item)
    q.append(item)
    another_calculation(q)

它在效率和可读性方面与

相比如何
q = []
while step <= step_max:
    calculate(item)
    q.append(item)
    q = q[-2:]
    another_calculation(q)

calculate()another_calculation() 在这种情况下不是真实的,但在我的实际程序中只是两个计算。我正在对数百万步的每一步进行这些计算(我在 2-d space 中模拟离子)。由于步骤太多,q 变得很长并且占用大量内存,而 another_calculation() 只使用 q 的最后两个值。我一直在使用后一种方法,然后听到 deque 提到并认为它可能更有效;因此问题。

即 python 中的双端队列与普通列表切片相比如何?

q = q[-2:]

现在这是一项代价高昂的操作,因为它每次都会重新创建一个列表(并复制引用)。 (这里一个讨厌的副作用是它改变了 q 的引用,即使你可以使用 q[:] = q[-2:] 来避免这种情况)。

deque 对象只是更改列表指针的开始和 "forgets" 最旧的项目。所以它更快,并且它是它的设计用途之一。

当然,对于2个值,没有太大区别,但是对于更大的数字,就有了。

如果我正确解释了你的问题,你有一个计算值的函数,你想用这个值和以前的值做另一个计算。最好的方法是使用两个变量:

while step <= step_max:
    item = calculate()
    another_calculation(previous_item, item)
    previous_item = item

如果计算是某种形式的矢量数学,您应该考虑使用 numpy。