1.queue
队列模块实现多生产者、多消费者队列。当信息必须在多个线程之间安全地交换时,它在线程编程中特别有用。这个模块中的队列类实现了所有必需的锁定语义。这取决于Python中线程支持的可用性;参见线程模块。
模块实现了三种类型的队列,它们只在检索条目的顺序上有所不同。在FIFO队列中,添加的第一个任务是第一个检索到的任务。在LIFO队列中,最近添加的条目是第一个检索到的条目(操作起来像堆栈一样)。对于优先级队列,条目保持排序(使用heapq模块),并首先检索值最低的条目。
queue模块定义了以下类和异常:
class Queue. Queue (maxsize=0) | FIFO队列的构造函数。maxsize是一个整数,它设置可放在队列中的项数的上限限制。一旦达到此大小,插入将阻塞,直到使用队列项为止(不会自动移除)。如果maxsize小于或等于0,则队列大小为无穷大。——先进先出 |
class Queue. LifoQueue (maxsize=0) | LIFO队列的构造函数。maxsize是一个整数,它设置可放在队列中的项数的上限限制。一旦达到此大小,插入将阻塞,直到使用队列项为止。如果maxsize小于或等于0,则队列大小为无穷大。——后进先出 |
class Queue. PriorityQueue (maxsize=0) | 优先队列的构造函数。maxsize是一个整数,它设置可放在队列中的项数的上限限制。一旦达到此大小,插入将阻塞,直到使用队列项为止。如果maxsize小于或等于0,则队列大小为无穷大。——有优先级的队列 首先检索值最低的条目(值最低的条目是通过排序(list(entries))[0]返回的条目)。条目的典型模式是表单中的元组:(priority_number, data)。 |
异常
exception Queue. Empty | 当非阻塞的在queue的空对象调用 get() (or get_nowait() )时抛出异常 |
exception Queue. Full | 当对已满的队列对象调用非阻塞put()(或put_nowait())时引发的异常。 |
Queue. qsize () | 返回队列的大致大小,所以,注意,qsize() > 0不能保证后续的get()不会阻塞,qsize() < maxsize也不能保证put()不会阻塞。 |
Queue. empty () | 如果队列为空,返回True,否则返回False,如果empty()返回True,它不能保证后续的put()调用不会阻塞。类似地,如果empty()返回False,它不能保证后续的get()调用不会阻塞。 |
Queue. full () | 如果队列已满,则返回True,否则返回False。如果full()返回True,它不能保证后续的get()调用不会阻塞。同样,如果full()返回False,则不能保证后续的put()调用不会阻塞。 |
Queue. put (item[, block[, timeout]]) | 往队列中添加项目的时候,如果可选的参数block = true,timeout=None(默认),如果有必要,阻塞,直到在空闲插槽可用之前。如果timeout是正数,它会阻塞最多timeout设定的秒数,如果在此时间内没有可用的空闲时间,则会引发Full异常。否则(block为false),如果一个空闲的插槽立即可用,就将一个item放到队列中,否则引发Full的异常(在这种情况下会忽略超时)。 |
Queue. put_nowait (item) | 相当于put(item, False) |
Queue. get ([block[, timeout]]) | 从队列中移除item,如果可选参数block = True,timeout = None(default),它会阻塞直到队列中有一个有效的项目,如果timeout >0,在达到设定的超时时间后还是没有有效的item,会抛出 如果block = False,在队列中如果有项目立即可以用,则返回item,否则抛出 |
Queue. get_nowait () | 等同于get(False) . |
Queue. task_done () | 指示插入队列任务完成,由队列消费者线程使用。每次使用get()之后都调用一下task_done(),告诉任务已经完成。 如果一个 |
Queue. join () | 阻塞,直到获取和处理队列中的所有项。当一个item添加到队列中时,未完成的任务数将会上升。当消费者线程调用 |
2.deque——像列表一样的容器,但是可以高效的从两边快速的添加和弹出,在两端性能都是O(1).
虽然列表对象支持类似的操作,但是它们针对快速固定长度的操作进行了优化.
在没指定最大长度或者长度定义为None的时候,队列长度可以增长到任意长度,否则限定为指定的长度,在队列满的情况下,在一端添加新项,则旧的数据会从另一端丢弃
创建双向队列 | 构造函数参数可以指定一个可迭代对象,若是没指定则新建的队列是空的, 下面例子参数是一个列表(可迭代对象) |
从右边添加一项 | ![]() |
从左边添加一项 | ![]() |
pop ()——从队列右边移除并返回一个元素,队列为空则抛出异常IndexError . | ![]() |
从左边删除一项 | ![]() |
反转双向队列 | ![]() |
copy()——创建一个副本 | ![]() |
clear ()——清除所有数据 | 长度将变为0 |
count (x)——统计队列中元素=X的个数 | ![]() |
extend() 一次性从右端添加多个元素 | 参数必须是可以迭代的,所以字符串拆开了 |
index (x[, start[, stop]])——元素X在队列中的序列,可以指定开始和结束的序列(可选的) | ![]() |
insert (i, x)——在序列i处插入元素x,之后x元素的序列为i | ![]() |
remove (value)——删除从左往右第一次出现的元素value | ![]() |
rotate (n=1)——当参数为正整数n时,rotate()将向右移动n位,并将队列右端的n个元素移到左端,当参数为负数-n是,rotate()将向左移动n位,并将队列左边的n个元素移动到右边。 | 等同于先弹出,再添加到左边 |
maxlen——有没有限定最大值边界 | ![]() |
3.heapq——优先级队列
堆是二叉树每个父节点的值都小于或等于其子节点,这个实现使用数组
heap[k] <= heap[2*k+1]
和heap[k] <= heap[2*k+2](K从0开始计数)
为了进行比较,不存在的元素被认为是无限的。堆的有趣特性是它的最小元素总是根heap[0]。
heap[0]是最小的项,而heap.sort()维护堆不变式!
堆是一种特殊的树形数据结构,每个节点都有一个值,通常我们所说的堆的数据结构指的是二叉树。堆的特点是根节点的值最大(或者最小),而且根节点的两个孩子也能与孩子节点组成子树,亦然称之为堆。
堆分为两种,大根堆和小根堆是一颗每一个节点的键值都不小于(大于)其孩子节点的键值的树。无论是大根堆还是小根堆(前提是二叉堆)都可以看成是一颗完全二叉树。下面以图的形式直观感受一下:——这部分转载https://blog.youkuaiyun.com/minxihou/article/details/51857518
要创heap,请使用初始化的空列表——[],或者您可以通过功能heapify()将一个已填充的列表转换成堆。
heapq. heappush (heap, item)——把item添加到heap中(heap是一个列表) | |