queueutils -优先级队列

Python附带了许多优秀的数据结构,来自 dictcollections.deque ,并且不乏可用的算法实现,来自 sorted()bisect 。但奇怪的是,优先级队列被归类为 heapq 。即使在那里,提出的方法也不是全功能的和面向对象的。有一个内置的优先级队列, Queue.PriorityQueue ,但除了其严酷的API之外,它还带有线程安全的双刃剑,使其适用于多线程、多使用者应用程序,但对于协作/单线程用例来说,开销很高。

这个 queueutils 模块目前提供两种队列实现: HeapPriorityQueue ,基于堆,以及 SortedPriorityQueue ,基于排序列表。两者都使用统一的API,基于 BasePriorityQueue 以便于在不同的应用程序用例上测试略有不同的性能特征。

>>> pq = PriorityQueue()
>>> pq.add('low priority task', 0)
>>> pq.add('high priority task', 2)
>>> pq.add('medium priority task 1', 1)
>>> pq.add('medium priority task 2', 1)
>>> len(pq)
4
>>> pq.pop()
'high priority task'
>>> pq.peek()
'medium priority task 1'
>>> len(pq)
3
class boltons.queueutils.BasePriorityQueue(**kw)[源代码]

此模块中其他PriorityQueue的抽象基类。重写 _backend_type 属性,以及 _push_entry()_pop_entry() 自定义子类行为的静态方法。)别忘了用 staticmethod() )。

参数:

priority_key (callable) -- 一个函数,它需要 priority 路过的时候 add() 并返回表示有效优先级的实数。

add(task, priority=None)[源代码]

将任务添加到队列,或更改 task 的优先级,如果 task 已经在队列中了。 task 可以是任何可哈希对象,并且 priority 默认为 0 。值越大表示优先级越高,但此行为可以通过设置 priority_key 在构造函数中。

peek(default=_REMOVED)[源代码]

读取队列中的下一个值,但不将其删除。退货 default 在空队列上,或提升 KeyError 如果 default 未设置。

pop(default=_REMOVED)[源代码]

移除并返回队列中的下一个值。退货 default 在空队列上,或提升 KeyError 如果 default 未设置。

remove(task)[源代码]

从优先级队列中删除任务。加薪 KeyError 如果 task 缺席了。

class boltons.queueutils.HeapPriorityQueue(**kw)[源代码]

继承自的优先级队列 BasePriorityQueue ,在列表的支持下,基于 heapq.heappop()heapq.heappush() 内置中的函数 heapq 模块。

boltons.queueutils.PriorityQueue

SortedPriorityQueue 的别名

class boltons.queueutils.SortedPriorityQueue(**kw)[源代码]

继承自的优先级队列 BasePriorityQueue ,基于 bisect.insort() 按顺序插入到排序列表中的方法。