python中heapq和PriorityQueue有什么区别?

yel*_*yed 35 python heap priority-queue data-structures

在蟒蛇有一个内置的heapq算法,让你push,pop,nlargest,nsmallest...等,你可以申请名单.但是,也有queue.PriorityQueue类似乎支持或多或少相同的功能.有什么区别,你何时会使用另一个?

Mar*_*ers 40

Queue.PriorityQueue是一个线程安全的类,而heapq模块没有线程安全保证.从Queue模块文档:

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

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

事实上,PriorityQueue 实现使用heapq引擎来进行所有优先级排序工作,基Queue类提供锁定以使此线程安全.有关详细信息,请参阅源代码.

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


Ror*_*ton 13

queue.PriorityQueue是类的部分包装器heapq

换句话说, aqueue.PriorityQueue实际上是 a heapq,放置在队列模块中,并带有几个重命名的方法,以使其heapq更易于使用,就像常规队列一样。

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

有一些功能heapq没有被继承到 中queue.PriorityQueue,例如heappushpop()heapreplace(),但您不太可能使用这些功能。如果你需要它们(我在我当前的项目中是这样做的),也许你应该使用heapq而不是queue.PriorityQueue.

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