【问题标题】:Is collection.deque the best implementation of constant length list in Python?Python中有没有更快的collection.deque替代品
【发布时间】:2022-10-07 12:24:52
【问题描述】:

我想限制python中列表的长度,每当len(list) > limit,第一项将被删除,我知道集合.deque可以实现相同的方式,但是,它会比仅仅执行以下操作要慢吗:

list_A = [2,4,6,8,11]
length_limit = 5
while True:
    # do something to the list, for example, list_A.append(2)
    if len(list_A) > length_limit:
        list_A = list_A[1:]

此外,做这样的事情或collection.deque,还有其他方法可以实现它的可读性和效率吗?

  • 复制将是 O(n),而 deque 是 O(1)。
  • 复制是什么意思? @机械猪
  • 当您使用切片lista[1:] 时,列表将被复制到除第一个元素之外的新列表。
  • 我明白了,所以 deque 是实现它的最快方法吗?谢谢@MechanicPig
  • list_A[1:] 在没有赋值的情况下不会改变任何东西。你的意思是list_A.pop(0)。正如已经建议使用双端队列。在末尾添加元素并在开始时删除元素会快得多。

标签: python list collections deque maxlength


【解决方案1】:

您需要知道的一个事实是 list 和 deque 在底部是不同的实现。在Cpython中,前者是dynamic array,后者是doubly linked list。数组擅长通过索引访问元素,但不擅长从内部插入或删除元素。相反,链表擅长从任何地方插入或删除元素(但要先确定节点)但不擅长通过索引访问元素。

至于你到目前为止所描述的,如果你不需要你的清单要获得高效的随机访问,deque 确实是最合适的选择。当你对列表使用切片时,python会根据切片指定的范围复制列表中的引用,并将它们存储在一个新的列表中。在您的情况下,这是一个 O(n) 操作(即,所需的时间与列表的长度成正比)。对于deque,当长度超过指定的maxlen时,只需简单的丢弃header节点即可(Cpython也优化了带有maxlen限制的deque)。这是一个O(1) 操作,显然比列表效率更高。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-06
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多