python中的队列

本文深入探讨了Python中的队列模块,包括FIFO队列、LIFO队列和优先级队列的实现与使用。详细介绍了队列类的构造函数、异常处理、队列操作方法以及队列大小的管理。同时,文章还讨论了deque双向队列和heapq优先级队列的特性和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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,会抛出Empty exception

如果block = False,在队列中如果有项目立即可以用,则返回item,否则抛出Empty exception (这种情况下timeout时忽略的)

Queue.get_nowait()等同于get(False).
Queue.task_done()

指示插入队列任务完成,由队列消费者线程使用。每次使用get()之后都调用一下task_done(),告诉任务已经完成。

如果一个join()正在阻塞,当所有项目处理完毕后,系统将恢复正常运行(意味着调用task_done()将会接收put()到队列中的每一项)。如果调用次数超过了队列中放置的项的次数,则抛出ValueError

Queue.join()

阻塞,直到获取和处理队列中的所有项。当一个item添加到队列中时,未完成的任务数将会上升。当消费者线程调用task_done(),未完成任务数将会减少,用来指示项目已经检索,并完成了对该项的所有工作。在未完成任务数减小到0,join()就会阻塞

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个元素移动到右边。

等同于先弹出,再添加到左边d.appendleft(d.pop())

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是一个列表) 
  
  
  
  
  
  
  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冥焱破晓

开发不易,写文章更难,感谢鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值