pythonでは、heapq
、Push
、pop
、nlargest
...などを提供する組み込みのnsmallest
アルゴリズムがあります。ただし、リストに適用できます。ただし、queue.PriorityQueue
ほぼ同じ機能をサポートしていると思われるクラス。違いは何ですか?また、いつ使用するのですか?
Queue.PriorityQueue
はスレッドセーフクラスですが、heapq
モジュールはスレッドセーフを保証しません。 Queue
module documentation から:
Queue
モジュールは、マルチプロデューサー、マルチコンシューマーのキューを実装します。複数のスレッド間で情報を安全に交換する必要があるスレッドプログラミングで特に役立ちます。このモジュールのQueue
クラスは、必要なロックセマンティクスをすべて実装しています。 Pythonでのスレッドサポートの可用性に依存します。threading
モジュールを参照してください。
heapq
モジュールはロックを提供せず、スレッドセーフではない標準のlist
オブジェクトで動作します。
実際、PriorityQueue
implementationは、フードの下でheapq
を使用してすべての優先順位付け作業を行い、ベースのQueue
クラスがこのスレッドセーフにするロックを提供します。詳細については ソースコード をご覧ください。
これにより、heapq
モジュールが高速になります。ロックのオーバーヘッドはありません。さらに、さまざまなheapq
関数をさまざまな新しい方法で自由に使用できます。PriorityQueue
はストレートキューイング機能のみを提供します。
_queue.PriorityQueue
_は、heapq
クラスの部分的なラッパーです。
つまり、_queue.PriorityQueue
_は実際にはheapq
であり、通常のキューと同様に、heapq
を使いやすくするためにいくつかの名前が変更されたメソッドとともにキューモジュールに配置されます。
heapq
では、メソッドheappush()
を使用して新しいアイテムを追加し、メソッドheappop()
を使用してアイテムを削除します。それはあまりキューに似ていないので、_queue.PriorityQueue
_を使用すると、Push
やpop
などの通常のキューメソッドを使用して同じことを行うことができます。
heapq
には、heappushpop()
やheapreplace()
など、_queue.PriorityQueue
_に引き継がれない機能がいくつかありますが、これらを使用する可能性は低くなります。それらが必要な場合(そして現在のプロジェクトで必要です)、おそらく_queue.PriorityQueue
_ではなくheapq
を使用する必要があります。
また、heapq
はその目的に特化されているため、スレッドセーフではありません(別の回答に記載されています)。