Python中优先级队列,优先处理高优先级任务

22

我需要一个优先队列,它可以首先获取具有最高优先级值的项目。我目前正在使用Queue库中的PriorityQueue类。然而,此函数只返回具有最低值的项目。我尝试了一些丑陋的解决方案,例如将(sys.maxint - priority)作为优先级,但我想知道是否存在更优雅的解决方案。

2个回答

43
使用负优先级即可,无需从sys.maxint中减去。
queue.put((-priority, item))

例如,优先级为-10的项目将在优先级为-5的项目之前返回。

4
虽然这样做有效,但它让我感到不舒服,因为这意味着你需要在脑海中反转所有其他相关逻辑。 - onesiumus
2
@blueman:然后子类化队列类并覆盖方法以为您反转优先级。 - Martijn Pieters

8
您可以扩展优先队列以保持逻辑不变:
from Queue import PriorityQueue

class DualPriorityQueue(PriorityQueue):
    def __init__(self, maxPQ=False):
        PriorityQueue.__init__(self)
        self.reverse = -1 if maxPQ else 1

    def put(self, priority, data):
        PriorityQueue.put(self, (self.reverse * priority, data))

    def get(self, *args, **kwargs):
        priority, data = PriorityQueue.get(self, *args, **kwargs)
        return self.reverse * priority, data


minQ = DualPriorityQueue()
maxQ = DualPriorityQueue(maxPQ=True)

minQ.put(10, 'A')
minQ.put(100, 'A')


maxQ.put(10, 'A')
maxQ.put(100,'A')

print "Min DQ: {}".format(minQ.get())
print "Max DQ: {}".format(maxQ.get())

输出:

Min DQ: (10, 'A')
Max DQ: (100, 'A')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接