python Priority Queue实现

时间:2013-11-02 17:39:41

标签: python priority-queue

我在使用以下参数创建插入函数时遇到问题。 insert函数应该包含一个优先级队列和一个元素,并使用优先级规则插入它 -

优先级队列将执行一系列任务并对其进行排序 基于它们的重要性。每个任务的整数优先级从10(最高优先级)到1 (最低优先级)。如果两个任务具有相同的优先级,则订单应基于订单 它们被插入到优先级队列中(早先的第一个)。

所以,截至目前我已经创建了以下代码来初始化所需的一些东西......

class Tasks():
    __slots__ = ('name', 'priority')

     def __init__(bval):
         bval.name = myName
         bval.priority = myPriority
         return bval

class PriorityQueue():
    __slots__ = ('queue', 'element')

     def __init__(aval):
         aval.queue = queue
         aval.element = element
         return aval

我正在尝试编写的代码是insert(element,queue):应该使用优先级队列插入元素。同样,myPriorty是1到10之间的整数。

同样可以执行以下操作以确保我创建1到10的优先级...

def __init__(bval , myPriority = 10):
      bval.priority = myPriority
      bval.pq = [[] for priority in range(bval.myPriority)]

这样我就可以用bval.pq

替换插入任务中的myPriority

4 个答案:

答案 0 :(得分:4)

你为什么要重新发明轮子?

来自队列导入PriorityQueue

http://docs.python.org/2/library/queue.html?highlight=priorityqueue#Queue.PriorityQueue

首先检索最低值的条目(最低值条目是按排序(列表(条目))[0]返回的条目。条目的典型模式是以下形式的元组:

(priority_number,data)。

我使用这样的模块在UI和后台轮询线程之间进行通信。

READ_LOOP = 5
LOW_PRI = 3
MED_PRI = 2
HI_PRI = 1
X_HI_PRI = 0

然后是这样的:

CoreGUI.TX_queue.put((X_HI_PRI,'STOP',[]))

答案 1 :(得分:2)

请注意,有一个Queue。如果你可以同步它,我会用它。

否则,您应该使用堆来维护您的队列。请参阅带有example的Python文档。

答案 2 :(得分:0)

来自亚历山德罗·莫利纳(Alessandro Molina)的一本好书“ Modern Python Standard Library Cookbook

堆是所有优先事项的完美匹配,例如 优先级队列:

import time
import heapq

class PriorityQueue:
    def __init__(self):
        self._q = []

    def add(self, value, priority=0):
        heapq.heappush(self._q, (priority, time.time(), value))

    def pop(self):
        return heapq.heappop(self._q)[-1]

示例:

>>> def f1(): print('hello')
>>> def f2(): print('world')
>>>
>>> pq = PriorityQueue()
>>> pq.add(f2, priority=1)
>>> pq.add(f1, priority=0)
>>> pq.pop()()
hello
>>> pq.pop()()
world

答案 3 :(得分:-2)

deque(from collections import deque)是单个队列的python实现。您可以在一端添加项目,并从另一端删除它们。如果每个优先级都有一个双端队列,则可以添加到所需的优先级。

它们看起来有点像这样:

from collections import deque

class PriorityQueue:
    def __init__(self, priorities=10):
        self.subqueues = [deque() for _ in range(levels)]

    def enqueue(self, priorty, value):
        self.subqueues[priority].append(value)

    def dequeue(self):
        for queue in self.subqueues:
            try:
                return queue.popleft()
            except IndexError:
                continue