哪个更好:deque或list切片?

时间:2018-06-11 19:06:49

标签: python performance slice deque

如果我使用代码

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与普通列表切片相比如何?

2 个答案:

答案 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。