在python中heapq和PriorityQueue之间的区别是什么?

时间:2016-05-02 21:06:45

标签: python data-structures heap priority-queue

在python中,有一个内置的heapq算法可以为您提供pushpopnlargestnsmallest等等你可以申请到名单。但是,queue.PriorityQueue类似乎支持或多或少相同的功能。有什么区别,什么时候会使用另一个?

2 个答案:

答案 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.PriorityQueueheapq类的部分包装。

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

heapq中,您可以使用方法heappush()添加新项目,使用方法heappop()删除一项。这不是非常类似队列的,因此queue.PriorityQueue允许您使用pushpop等通常的队列方法来执行相同的操作。

heapq的某些功能未转入queue.PriorityQueue,例如heappushpop()heapreplace(),但您不太可能使用这些功能。如果你需要它们(我在我当前的项目中),也许你应该使用heapq而不是queue.PriorityQueue

此外,由于heapq专门用于其目的,因此它不是线程安全的(如此处的另一个答案所述。)