如果我使用代码
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维空间中模拟离子)。由于步骤太多,q
会变得非常长并且占用大量内存,而another_calculation()
仅使用q
的最后两个值。我一直在使用后一种方法,然后听到deque
提到并认为它可能更有效率;因此问题。
即,python中的deques与普通列表切片相比如何?
答案 0 :(得分:5)
q = q[-2:]
现在这是一项代价高昂的操作,因为它每次都会重新创建一个列表(并复制引用)。 (这里令人讨厌的副作用是它改变了q
的引用,即使你可以使用q[:] = q[-2:]
来避免这种情况。)
deque
对象只是更改列表指针的开头并“忘记”最旧的项目。所以它更快,它是它的设计用途之一。
当然,对于2个值,没有太大区别,但是对于更大的数字,则存在。
答案 1 :(得分:0)
如果我正确地解释了你的问题,你有一个计算一个值的函数,你想用这个和前一个值做另一个计算。最好的方法是使用两个变量:
while step <= step_max:
item = calculate()
another_calculation(previous_item, item)
previous_item = item
如果计算是某种形式的矢量数学,你应该考虑使用numpy。