哪个更好:德克切片和列表切片?



如果我使用代码

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。

最新更新