在python中,有一个内置的heapq
算法可以为您提供push
,pop
,nlargest
,nsmallest
等等你可以申请到名单。但是,queue.PriorityQueue
类似乎支持或多或少相同的功能。有什么区别,什么时候会使用另一个?
答案 0 :(得分:32)
Queue.PriorityQueue
是一个线程安全的类,而heapq
模块没有线程安全保证。来自Queue
module documentation:
Queue
模块实现多生产者,多消费者队列。当必须在多个线程之间安全地交换信息时,它在线程编程中特别有用。此模块中的Queue
类实现了所有必需的锁定语义。这取决于Python中线程支持的可用性;请参阅threading
模块。
heapq
模块不提供锁定,并且对标准list
对象进行操作,这些对象并不是线程安全的。
事实上,PriorityQueue
实现使用heapq
来完成所有优先级排序工作,基础Queue
类提供锁定以实现此目的线程安全的。有关详细信息,请参阅source code。
这使heapq
模块更快;没有锁定开销。此外,您可以以不同的,新颖的方式自由使用各种heapq
函数,PriorityQueue
仅提供直接排队功能。
答案 1 :(得分:4)
queue.PriorityQueue
是heapq
类的部分包装。
换句话说,queue.PriorityQueue
实际上是heapq
,放在队列模块中,带有几个重命名的方法,使heapq
更容易使用,就像常规队列一样
在heapq
中,您可以使用方法heappush()
添加新项目,使用方法heappop()
删除一项。这不是非常类似队列的,因此queue.PriorityQueue
允许您使用push
和pop
等通常的队列方法来执行相同的操作。
heapq
的某些功能未转入queue.PriorityQueue
,例如heappushpop()
和heapreplace()
,但您不太可能使用这些功能。如果你需要它们(我在我当前的项目中),也许你应该使用heapq
而不是queue.PriorityQueue
。
此外,由于heapq
专门用于其目的,因此它不是线程安全的(如此处的另一个答案所述。)