哪个更好:deque或list切片?

hea*_*her -1 python performance deque slice

如果我使用代码

from collections import deque
q = deque(maxlen=2)
while step <= step_max:
    calculate(item)
    q.append(item)
    another_calculation(q)
Run Code Online (Sandbox Code Playgroud)

它如何在效率和可读性方面进行比较

q = []
while step <= step_max:
    calculate(item)
    q.append(item)
    q = q[-2:]
    another_calculation(q)
Run Code Online (Sandbox Code Playgroud)

calculate()并且another_calculation()在这种情况下并不真实,但在我的实际程序中只是两个计算.我正在为数百万步骤的每一步进行这些计算(我在2维空间中模拟离子).因为步骤太多,所以需要q很长时间并且使用大量内存,而another_calculation()只使用最后两个值q.我一直在使用后一种方法,然后听到deque提到并认为它可能更有效; 因此问题.

也就是说,python中的deques与普通列表切片相比如何?

Jea*_*bre 5

q = q[-2:]
Run Code Online (Sandbox Code Playgroud)

现在这是一项代价高昂的操作,因为它每次都会重新创建一个列表(并复制引用).(这里令人讨厌的副作用是它改变了参考,q即使你可以使用它q[:] = q[-2:]来避免这种情况).

deque对象只是更改列表指针的开头并"忘记"最旧的项目.所以它更快,它是它的设计用途之一.

当然,对于2个值,没有太大的区别,但是对于更大的数字,存在.

  • 我做了一些快速计时,并且当附加4个项目时,deque方法已经更快(并且只有2或3个项目稍慢一点).对于大量值,使用双端队列大约快3倍. (2认同)