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