collection.deque是Python中常量长度列表的最佳实现吗?

mmvthczy  于 2022-12-21  发布在  Python
关注(0)|答案(1)|浏览(152)

我想在python中限制列表的长度,当len(list) > limit时,第一项会被移除,collection.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更具可读性和效率?

hl0ma9xz

hl0ma9xz1#

你需要知道的一个事实是list和deque在底层是不同的实现,在Cpython中,前者是一个dynamic array,后者是一个doubly linked list,数组擅长通过索引访问元素,但不擅长从内部插入或移除元素,相反,链表擅长于从任何地方插入或移除元素(但应该首先确定节点),但不擅长于通过索引访问元素。
至于你到目前为止所描述的,如果你不需要 * 你的list* 来进行高效的随机访问,deque确实是最合适的选择,当你对一个list使用slicing时,python会根据slicing指定的范围复制list中的引用,并将它们存储在一个新的list中,在你的情况下,这是一个O(n)操作(即所需时间与链表长度成正比),对于deque来说,当长度超过指定的maxlen时,只需要简单地丢弃头节点即可(Cpython也对deque进行了maxlen限制的优化),这是一个O(1)操作,显然比链表效率更高。

相关问题