哪个更好:双端队列或列表切片?
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。
如果我用代码
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。