1. import heapq
    2. class PriorityQueue:
    3. def __init__(self):
    4. self._queue = []
    5. self._index = 0
    6. def push(self, item, priority):
    7. # priority越大表示元素优先级越高,-priority就越小,因此越能优先pop
    8. heapq.heappush(self._queue, (-priority, self._index, item))
    9. self._index += 1
    10. def pop(self):
    11. # 返回heap中最小的元素
    12. return heapq.heappop(self._queue)[-1]
    13. class Item:
    14. def __init__(self, name):
    15. self.name = name
    16. def __repr__(self):
    17. return f"Item({self.name})"
    18. # 观察实际效果
    19. q = PriorityQueue()
    20. q.push(Item("foo"), 1) # 优先级与元素4相同,但index小于元素4,因此优先pop
    21. q.push(Item("bar"), 5) # 优先级最高
    22. q.push(Item("spam"), 4) # 优先级次之
    23. q.push(Item("grok"), 1)
    24. q.pop() # Item('bar')
    25. q.pop() # Item('spam')
    26. q.pop() # Item('foo')