In python there’s a built-in heapq
algorithm that gives you push
, pop
, nlargest
, nsmallest
. .. 等等,您可以将其应用于列表。但是,还有 queue.PriorityQueue
类似乎或多或少地支持相同的功能。有什么区别,你什么时候会用一个而不是另一个?
原文由 yelsayed 发布,翻译遵循 CC BY-SA 4.0 许可协议
In python there’s a built-in heapq
algorithm that gives you push
, pop
, nlargest
, nsmallest
. .. 等等,您可以将其应用于列表。但是,还有 queue.PriorityQueue
类似乎或多或少地支持相同的功能。有什么区别,你什么时候会用一个而不是另一个?
原文由 yelsayed 发布,翻译遵循 CC BY-SA 4.0 许可协议
queue.PriorityQueue
是 heapq
类的部分包装器。
换句话说,一个 queue.PriorityQueue
实际上是一个 heapq
,用几个重命名的方法放在队列模块中,使 heapq
更容易使用,就像—一个常规队列。
在 heapq
中,您使用方法 heappush()
添加一个新项目,使用方法 heappop()
删除一个。这不是很像队列,所以 queue.PriorityQueue
让你使用常用的队列方法,例如 put
和 get
做同样的事情—
There are some features of heapq
that are not carried over into queue.PriorityQueue
, such as heappushpop()
and heapreplace()
, but you are less likely to使用那些。如果您需要它们(我在当前项目中需要),也许您应该使用 heapq
而不是 queue.PriorityQueue
。
此外,由于 heapq
专门用于其用途,因此它不是线程安全的(如此处的另一个答案所述。)
原文由 Rory Daulton 发布,翻译遵循 CC BY-SA 4.0 许可协议
2 回答5.2k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
2 回答879 阅读✓ 已解决
1 回答1.8k 阅读✓ 已解决
Queue.PriorityQueue
是线程安全类,而heapq
模块不提供线程安全保证。来自Queue
模块文档:heapq
模块不提供锁定,并在标准list
对象上运行,这些对象并不是线程安全的。事实上,
PriorityQueue
实现 使用heapq
在引擎盖下完成所有优先级工作,基础Queue
这个类提供锁定。线程安全有关详细信息,请参阅 源代码。这使得
heapq
模块更快;没有锁定开销。此外,您可以以不同的新颖方式自由使用各种heapq
功能,PriorityQueue
仅提供直接排队功能。