什么是优先队列?
优先队列(Priority Queue)是一种特殊的队列,其中每个元素都有一个“优先级”。出队时,并不是按照先进先出(FIFO)的原则,而是优先级最高的元素最先被取出。
在 Python 中,可以通过标准库 queue.PriorityQueue 或更常用的 heapq 模块来实现优先队列。
使用 heapq 实现优先队列(推荐)
heapq 是基于最小堆(min-heap)实现的,性能优于 queue.PriorityQueue(后者是线程安全但较慢)。
import heapq
# 创建空堆
pq = []
# 入队:使用 heappush
heapq.heappush(pq, (1, '任务A'))
heapq.heappush(pq, (3, '任务C'))
heapq.heappush(pq, (2, '任务B'))
# 出队:使用 heappop
while pq:
priority, task = heapq.heappop(pq)
print(f"执行 {task}(优先级: {priority})")
输出:
执行 任务A(优先级: 1)
执行 任务B(优先级: 2)
执行 任务C(优先级: 3)
使用 queue.PriorityQueue(线程安全)
适用于多线程环境,但单线程下性能不如 heapq。
from queue import PriorityQueue
pq = PriorityQueue()
pq.put((1, '任务A'))
pq.put((3, '任务C'))
pq.put((2, '任务B'))
while not pq.empty():
priority, task = pq.get()
print(f"执行 {task}(优先级: {priority})")
注意事项
- 元组的第一个元素用于比较优先级,必须支持比较操作(如数字、字符串等)。
- 若优先级相同,
heapq会尝试比较第二个元素,因此建议第二个元素也支持比较,或使用唯一 ID 避免错误。 - 如需最大堆,可将优先级取负值:
heapq.heappush(pq, (-priority, item))。
典型应用场景
- 任务调度系统:高优先级任务优先执行。
- Dijkstra 最短路径算法:每次取出当前距离最小的节点。
- 合并 K 个有序链表:每次从 K 个头节点中取最小值。
- 实时事件处理:按时间戳或紧急程度排序。