import heapq
class PriorityQueue:
def __init__(self):
self._queue = []
self._index = 0
def push(self, item, priority):
# priority越大表示元素优先级越高,-priority就越小,因此越能优先pop
heapq.heappush(self._queue, (-priority, self._index, item))
self._index += 1
def pop(self):
# 返回heap中最小的元素
return heapq.heappop(self._queue)[-1]
class Item:
def __init__(self, name):
self.name = name
def __repr__(self):
return f"Item({self.name})"
# 观察实际效果
q = PriorityQueue()
q.push(Item("foo"), 1) # 优先级与元素4相同,但index小于元素4,因此优先pop
q.push(Item("bar"), 5) # 优先级最高
q.push(Item("spam"), 4) # 优先级次之
q.push(Item("grok"), 1)
q.pop() # Item('bar')
q.pop() # Item('spam')
q.pop() # Item('foo')