栈:数据是后进先出 (LIFO) last in first out
队列:数据是先进先出 (FIFO) first in first out
第一种就是列表:(既可以模拟栈也可以模拟队列)一好以差。
列表是一种容器序列,而且在模拟栈操作的时候,速度也是比较可以的。
在模拟栈操作时,必须用append于pop。(模拟栈的时候,性能优秀)
In [228]: ll = list() In [229]: ll.append('任务1') In [230]: ll.append('任务2') In [231]: ll.append('任务3') In [232]: ll.pop(0) Out[232]: '任务1' In [233]: ll.pop(0) Out[233]: '任务2' In [234]: ll.pop(0) Out[234]: '任务3'
这样的模拟操作队列效率是非常低的,因为你每次移出第一个元素,后面的元素索引都会发生变化
专业的说法需要的时间为O(n)
第二个为collections.deque,这个一个模拟栈于队列都非常优秀的容器序列。
除了随机访问该对象中间的元素的性能很差,耗时为O(n),但一半操作容器序列,很少取访问中间元素。
模拟栈操作:
In [235]: from collections import deque In [236]: q = deque? Init signature: deque(self, /, *args, **kwargs) Docstring: deque([iterable[, maxlen]]) --> deque object A list-like sequence optimized for data accesses near its endpoints. File: /usr/local/Cellar/python/3.7.4/Frameworks/Python.framework/Versions/3.7/lib/python3.7/collections/__init__.py Type: type Subclasses: In [237]: q = deque() In [238]: q.append('任务1') In [239]: q.append('任务2') In [240]: q.append('任务3') In [241]: q.pop() Out[241]: '任务3' In [242]: q.pop() Out[242]: '任务2' In [243]: q.pop() Out[243]: '任务1' In [244]: q Out[244]: deque([])
模拟队列操作:
In [246]: q.append('任务1') In [247]: q.append('任务2') In [248]: q.append('任务3') In [249]: q Out[249]: deque(['任务1', '任务2', '任务3']) In [250]: q.popleft() Out[250]: '任务1' In [251]: q.popleft() Out[251]: '任务2' In [252]: q.popleft() Out[252]: '任务3'
上面两个是即可以模拟栈,又可以模拟队列的容器序列,下面介绍的是只能单一模拟栈或者队列的。
queue.LifoQueue从字面就可以看出来是模拟栈的,后进先出。queue模块下的容器序列,提供了锁语句来支持多个并发的生产者于消费者。模块下面的很多类的实例一般用在线程间的通讯。