priority heapq python data-structures heap priority-queue

heapq - max heap python



¿Cuál es la diferencia entre heapq y PriorityQueue en python? (2)

queue.PriorityQueue es un contenedor parcial de la clase heapq.

En otras palabras, un queue.PriorityQueue es en realidad un heapq, colocado en el módulo de cola con un par de métodos renombrados para facilitar el uso del heapq, al igual que una cola normal.

En heapq, use el método heappush () para agregar un nuevo elemento y el método heappop () para eliminar uno. Eso no es muy parecido a una cola, por lo que queue.PriorityQueue te permite usar los métodos de cola habituales, como pulsar y hacer pop para hacer lo mismo.

Hay algunas características de heapq que no se transfieren a queue.PriorityQueue, como heappushpop () y heapreplace (), pero usted es menos parecido a usarlas. Si los necesita (y lo hago en mi proyecto actual), use heapq en lugar de queue.PriorityQueue.

Además, dado que heapq está especializado para su propósito, no es seguro para subprocesos (como se señala en otra respuesta aquí).

En python hay un algoritmo heapq que te ofrece push , pop , nlargest , nsmallest ... etc que puedes aplicar a las listas. Sin embargo, también está la clase queue.PriorityQueue que parece soportar más o menos la misma funcionalidad. ¿Cuál es la diferencia, y cuándo usarías una sobre la otra?


Queue.PriorityQueue es una clase segura para subprocesos, mientras que el módulo heapq no garantiza la seguridad de subprocesos. De la documentación del módulo Queue :

El módulo Queue implementa Queue múltiples productores y consumidores múltiples. Es especialmente útil en la programación con hilos cuando la información debe intercambiarse de forma segura entre múltiples hilos. La clase Queue en este módulo implementa todas las semánticas de bloqueo requeridas. Depende de la disponibilidad del soporte de subprocesos en Python; ver el módulo de threading .

El módulo heapq no ofrece bloqueo, y opera en objetos de list estándar, que no están diseñados para ser subprocesos.

De hecho, la implementación de PriorityQueue usa heapq bajo el capó para realizar todo el trabajo de priorización, con la clase base Queue proporciona el bloqueo para que este hilo sea seguro. Ver el código fuente para más detalles.

Esto hace que el módulo heapq más rápido; no hay bloqueo de arriba. Además, puede usar las diferentes funciones de heapq maneras diferentes y novedosas, PriorityQueue solo ofrece la funcionalidad de puesta en cola directa.