python - Python的Queue.PriorityQueue不是自动排序的吗?

标签 python python-2.7 queue priority-queue

我刚开始使用 Python 中的队列,最近开始使用 PriorityQueue。

我期望元素会根据优先级编号插入队列中。也就是说,如果我做了类似的事情:

from Queue import PriorityQueue

q = PriorityQueue()
q.put((1, '1'))
q.put((4, 'last'))
q.put((2, '2'))
q.put((3, '3'))

print q.queue

我期待这个输出:

[(1, '1'), (2, '2'), (3, '3'), (4, 'last')].

相反,我得到:

[(1, '1'), (3, '3'), (2, '2'), (4, 'last')]

但是,如果我通过以下方式将元素从队列中取出:

while not q.empty():
    item = q.get()
    print item

我确实得到了我期望的输出:

(1, '1')
(2, '2')
(3, '3')
(4, 'last')

我试图通过在某些点打印队列来调试某些内容,并注意到元素的顺序不符合我的预期。除非我错过了,否则 Queue 的文档不会提及任何有关排序的内容。我只是错误地期望它被分类吗?出于效率原因,是否可以简单地不以这种方式实现?

最佳答案

优先级队列不应该被排序。优先级队列仅保证当您调用 get() 时,它会返回最高优先级的项目。

在内部,queue.PriorityQueue 使用 binary heap包含项目。

它不使用排序数组的原因是维护排序数组的成本很高。添加和删​​除项目将是 O(n) 操作。二叉堆进行那些 O(log n) 操作。

参见 https://github.com/python/cpython/blob/2.7/Lib/Queue.pyhttps://docs.python.org/2/library/heapq.html了解详情。

关于python - Python的Queue.PriorityQueue不是自动排序的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50616152/

相关文章:

python - 从字符串中提取日期 ("05/Jan/2014")

python 在 where 子句中使用元组或数组

python - 如何使用Python生成器

python - Python 中的时间戳 YYYY-MM-DDThh :mm:ss. sssTZD

python - PyQt:将信息从 GUI 发送到线程

python - 如何在 Python 中以相反的顺序读取 CSV 文件?

python - 如何按顺序给定笔划的一些坐标(x,y)来平滑笔划?

queue - 将ConcurrentQueue <T>公开为IObservable <T>?

python - 支持 python 2 和 3 : str, 字节或替代

javascript - jQuery 延迟对象