【问题标题】:Which is better: deque or list slicing?哪个更好:双端队列或列表切片?
【发布时间】:2018-11-21 02:29:13
【问题描述】:

如果我使用代码

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

【问题讨论】:

  • @timgeb 我可以计时,但我不知道为什么有些东西更快或更慢。我通过提问来了解更多信息。无论如何,对不起,我没有问一个足够好的问题。
  • 最快的方法是创建一个包含一个元素的列表:q = [item]。因此,这取决于您真正想做的事情,哪种解决方案是最好的。
  • @Daniel 我将向列表中添加多个元素;我只是在说明如何使用它。
  • @heather: 举个例子,目前没用。
  • @Daniel 已更新。

标签: python performance slice deque


【解决方案1】:
q = q[-2:]

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

deque 对象只是更改了列表指针的开头并“忘记”了最旧的项目。所以它速度更快,这是它的设计用途之一。

当然,对于 2 个值来说,差别不大,但对于更大的数字,差别不大。

【讨论】:

  • 我做了一些快速的计时,当附加 4 项时,双端队列方法已经更快了(并且在 2 或 3 项时稍微慢了一点)。对于大量值,使用双端队列大约快 3 倍。
  • @ThierryLathuille 谢谢。我怀疑列表切片经过优化,值很小,就可以击败双端队列的开销。
  • @ThierryLathuille 所以在我的使用中,只需要两个值,列表切片会更好吗?或者它们是否具有可比性(在这种情况下,一种更被接受/更易读)?
  • 在那些极限情况下,您必须同时计时,并选择最快的。但请注意,没有人需要增加该值,这会使代码变慢(对此留下一个很大的“警告”评论)。根据机器和python版本,最快的可能不一样。
  • @heather 我对长度为 2 的队列进行了计时。当队列变长时,列表切片会变得更糟:对于长度为 1000 的队列,列表切片比双端队列慢 50 倍。
【解决方案2】:

如果我正确解释了您的问题,那么您有一个计算值的函数,并且您想用这个值和前一个值进行另一次计算。最好的方法是使用两个变量:

while step <= step_max:
    item = calculate()
    another_calculation(previous_item, item)
    previous_item = item

如果计算是某种形式的矢量数学,您应该考虑使用 numpy。

【讨论】:

    猜你喜欢
    • 2012-06-29
    • 2012-04-17
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 2016-01-19
    • 1970-01-01
    相关资源
    最近更新 更多