python中的heapq和PriorityQueue有什么区别?

新手上路,请多包涵

In python there’s a built-in heapq algorithm that gives you push , pop , nlargest , nsmallest . .. 等等,您可以将其应用于列表。但是,还有 queue.PriorityQueue 类似乎或多或少地支持相同的功能。有什么区别,你什么时候会用一个而不是另一个?

原文由 yelsayed 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

Queue.PriorityQueue 是线程安全类,而 heapq 模块不提供线程安全保证。来自 Queue 模块文档

Queue 模块实现了多生产者、多消费者队列。当必须在多个线程之间安全地交换信息时,它在线程编程中特别有用。该模块中的 Queue 类实现了所有必需的锁定语义。这取决于 Python 中线程支持的可用性;请参阅 threading 模块。

heapq 模块不提供锁定,并在标准 list 对象上运行,这些对象并不是线程安全的。

事实上, PriorityQueue 实现 使用 heapq 在引擎盖下完成所有优先级工作,基础 Queue 这个类提供锁定。线程安全有关详细信息,请参阅 源代码

这使得 heapq 模块更快;没有锁定开销。此外,您可以以不同的新颖方式自由使用各种 heapq 功能, PriorityQueue 仅提供直接排队功能。

原文由 Martijn Pieters 发布,翻译遵循 CC BY-SA 3.0 许可协议

queue.PriorityQueueheapq 类的部分包装器。

换句话说,一个 queue.PriorityQueue 实际上是一个 heapq ,用几个重命名的方法放在队列模块中,使 heapq 更容易使用,就像—一个常规队列。

heapq 中,您使用方法 heappush() 添加一个新项目,使用方法 heappop() 删除一个。这不是很像队列,所以 queue.PriorityQueue 让你使用常用的队列方法,例如 putget 做同样的事情—

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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题