你们都知道利用 .append 和 .pop 方法,咱们能够把列表看成栈或者队列来用(好比,把 append 和 pop(0) 合起来用,就能模拟栈的“先进先出”的特色)。可是删除列表的第一个元素(抑或是在第一个元素以前添加一个 元素)之类的操做是很耗时的,由于这些操做会牵扯到移动列表里的全部元素。这个时候双向队列就又做用了。安全
collections.deque 类(双向队列)是一个线程安全、能够快速从两端添加或者删除元素的数据类型。并且若是想要有一种数据类型来存 放“最近用到的几个元素”,deque 也是一个很好的选择。这是由于在新建一个双向队列的时候,你能够指定这个队列的大小,若是这个队列满员了,还能够从反向端删除过时的元素,而后在尾端添加新的元素。多线程
下面用几个实例来讲明如何使用双向队列以及带来了什么方便的处理方式。app
一开始咱们须要先初始化一个固定长度的双向队列便于咱们实验。优化
说明:maxlen 是一个可选参数,表明这个队列能够容纳的元素的数量,不可变。spa
from collections import deque #双向队列 listdq=deque(range(10),maxlen=10) print (listdq)
1.正向旋转(循环)线程
说明:队列的旋转操做接受一个参数 n,当 n > 0 时,队列的最右边的 n 个元素会被移动到队列的左边。当 n < 0 时,最左边的 n 个元素会被 移动到右边。code
#正向旋转 listdq.rotate(2) print(listdq)
2.反向旋转(逆时针)blog
#反向旋转 listdq.rotate(-2) print(listdq)
3.附加数据队列
说明:当试图对一个已满(len(d) == d.maxlen)的队列作尾部添加操做的时候,它头部的元素会被删除掉。注意在下一行里,元素 0 被删除 了。资源
#附加数据
listdq.appendleft(-1)
print(listdq)
listdq.append(10)
print(listdq)
4.扩展数据
说明:extendleft(iter) 方法会把迭代器里的元素逐个添加到双向队列的左边,所以迭代器里的元素会逆序出如今队列里。注意是逆序。
#扩展数据 listdq.extendleft([20,30,40]) print(listdq) listdq.extend([50]) print(listdq)
以上代码结果以下:
双向列表和队列的方法介绍:
本篇总结了列表和双向队列这两个类型的方法(object 类包含的方 法除外)。双向队列实现了大部分列表所拥有的方法,也有一些额外的符合自身设 计的方法,好比说 popleft 和 rotate。可是为了实现这些方法,双向 队列也付出了一些代价,从队列中间删除元素的操做会慢一些,由于它 只对在头尾的操做进行了优化。append 和 popleft 都是原子操做,也就说是 deque 能够在多线程程序 中安全地看成先进先出的栈使用,而使用者不须要担忧资源锁的问题。