ゼファーネットのロゴ

Python のキューのガイド

日付:

概要

単純な整数の保存から複雑なワークフローの管理まで、データ構造は堅牢なアプリケーションの基礎を築きます。 その中で、 キュー 多くの場合、興味深いものとして、またどこにでも存在するものとして現れます。 考えてみてください – 銀行の行列、ファーストフードのカウンターで順番を待っている、コンピューター システムでタスクをバッファリングしているなど、これらすべてのシナリオは行列の仕組みと共鳴します。

列の最初の人が最初にサービスを受け、新しく到着した人は最後に加わります。 これはキューが実際に動作している例です。

python-01 のキューへのガイド.png

開発者にとって、特に Python の場合、キューはコンピューター サイエンスの教科書に登場する単なる理論的な構成要素ではありません。 これらは、多くのアプリケーションの基礎となるアーキテクチャを形成します。 プリンターでのタスクの管理から、ライブ ブロードキャストでのデータ ストリームのシームレスな確保に至るまで、キューは不可欠な役割を果たします。

このガイドでは、キューの概念を深く掘り下げ、その特性、実際のアプリケーション、そして最も重要なことに、Python でキューを効果的に実装して使用する方法を探ります。

キューのデータ構造とは何ですか?

データ構造のランドスケープをナビゲートすると、データの入力と取得に明確なルールを持つコンテナーに遭遇することがよくあります。 このうち、 キュー その優雅さと率直さが際立っています。

FIFO の原則

キューの核心は、次の条件に従う線形データ構造です。 先入れ先出し (FIFO) 原理。 これは、キューに追加された最初の要素が最初に削除されることを意味します。 これを共感できるシナリオに例えると、チケット カウンターに並ぶ顧客の列を考えてみましょう。 先に到着した人が先にチケットを受け取り、その後に到着した人は最後尾に並んで順番を待ちます。

注: キューには XNUMX つの端があります。 後部と前部。 前部は要素が削除される場所を示し、後部は新しい要素が追加される場所を示します。

基本的なキュー操作

  • Enqueue – の行為 追加 最後まで要素 (リア) キューの。

    python-02 のキューへのガイド.png

  • デキュー – の行為 除去 からの要素 フロント キューの。

    python-03 のキューへのガイド.png

  • 覗き見または正面 – 多くの状況では、前要素を取り外さずに観察するだけで効果があります。 この操作により、まさにそれが可能になります。

  • IsEmpty – キューに要素があるかどうかを判断するのに役立つ操作。 これは、キューにデータがあるかどうかによってアクションが左右されるシナリオでは非常に重要です。

注: サイズが制限されているキュー (制限付きキュー) もあれば、システム メモリが許す限り拡張できるキュー (制限なしキュー) もあります。

キューのシンプルさと明確な操作ルールにより、キューはソフトウェア開発のさまざまなアプリケーション、特に秩序正しく体系的な処理を必要とするシナリオに最適です。

ただし、理論を理解することは最初のステップにすぎません。 先に進むにつれて、Python でキューを実装する方法を示しながら、実践的な側面を掘り下げていきます。

Python でキューを実装する方法 – リスト、デック、キュー モジュール

Python は、豊富な標準ライブラリと使いやすい構文を備えており、キューを実装して操作するためのメカニズムをいくつか提供しています。 これらはすべてキュー管理の基本的な目的を果たしますが、微妙な違い、利点、および潜在的な落とし穴も伴います。 それぞれのアプローチを詳しく分析し、その仕組みと最適な使用例を説明します。

注: 操作を実行する前に、必ずキューのステータスを確認してください。 たとえば、エラーを避けるために、デキューする前にキューが空かどうかを確認します。 同様に、境界付きキューの場合は、キューに入れる前にスペースがあることを確認してください。

Python リストを使用してキューを実装する

Python の組み込みリストを使用してキューを実装するのは直感的で簡単です。 外部ライブラリや複雑なデータ構造は必要ありません。 ただし、このアプローチは大規模なデータセットに対しては効率的ではない可能性があります。 リストの先頭から要素を削除する (pop(0)) には直線的な時間がかかるため、パフォーマンスの問題が発生する可能性があります。

注: 高いパフォーマンスを要求するアプリケーションや、大量のデータを扱うアプリケーションの場合は、 collections.deque エンキューとデキューの両方の時間の複雑さを一定にします。

まずはキューを表すリストを作成しましょう。

queue = []

要素をキューの最後に追加する (キューに入れる) プロセスは、要素をリストに追加することに他なりません。


queue.append('A')
queue.append('B')
queue.append('C')
print(queue) 

また、キューの先頭から要素を削除する (デキューする) ことは、単にリストの最初の要素を削除することと同じです。


queue.pop(0)
print(queue) 

使い方 コレクション.deque キューを実装する

このアプローチは非常に効率的です。 deque を使用して実装されます 二重リンクリスト。 両端からの高速 O(1) アペンドおよびポップをサポートします。 このアプローチの欠点は、 わずかに 初心者にとっては直感的ではありません。

まず、インポートします deque からのオブジェクト collections モジュールを作成し、キューを初期化します。

from collections import deque queue = deque()

これで、 append() 要素をエンキューするメソッドと popleft() キューから要素をデキューするメソッド:

ベストプラクティス、業界で認められた標準、および含まれているチートシートを含む、Gitを学習するための実践的で実用的なガイドを確認してください。 グーグルGitコマンドを停止し、実際に 学ぶ それ!


queue.append('A')
queue.append('B')
queue.append('C')
print(queue) queue.popleft()
print(queue) 

Python の使用 キュー キューを実装するモジュール

  queue Python の標準ライブラリのモジュールは、さまざまなユースケースに対応する、キュー管理に対するより特殊なアプローチを提供します。

  • シンプルキュー – 基本的な FIFO キュー
  • リフォキュー – LIFO キュー、本質的にはスタック
  • プライオリティキュー – 要素は、割り当てられた優先順位に基づいてデキューされます。

注: を選ぶ queue モジュールは、次のように設計されています スレッドセーフ。 これにより、キューでの同時操作が予期しない結果につながることがなくなります。

このアプローチは、キュー操作用に明示的に設計されているため、優れています。 しかし、正直に言うと、単純なシナリオではやりすぎかもしれません。

さあ、使ってみましょう queue モジュールをプロジェクトにインポートします。

import queue

単純な FIFO キューを実装しているため、次のコマンドを使用して初期化します。 SimpleQueue() ビルダー:

q = queue.SimpleQueue()

エンキューおよびデキュー操作は次を使用して実装されます。 put() & get() からのメソッド queue モジュール:


q.put('A')
q.put('B')
q.put('C')
print(q.queue) q.get()
print(q.queue) 

注: キュー操作により例外が発生し、処理されないとアプリケーションのフローが中断される可能性があります。 これを防ぐには、キュー操作を次のようにラップします。 try-except ブロック。

たとえば、 queue.Empty を使用する場合の例外 queue モジュール:

import queue q = queue.SimpleQueue() try: item = q.get_nowait()
except queue.Empty: print("Queue is empty!")

どの実装を選択するか?

Python でのキュー実装の選択は、アプリケーションの要件に合わせて行う必要があります。 大量のデータを処理している場合、または最適化されたパフォーマンスが必要な場合は、 collections.deque やむを得ない選択です。 ただし、マルチスレッド アプリケーションの場合、または優先順位が考慮される場合、 queue モジュールは堅牢なソリューションを提供します。 簡単なスクリプトの場合、または始めたばかりの場合は、Python リストで十分かもしれませんが、潜在的なパフォーマンスの落とし穴に常に注意してください。

注: Python がすでに強力な組み込みソリューションを提供している場合に、キュー操作をカスタム実装することで車輪の再発明を行います。
カスタム ソリューションを作成する前に、次のような Python の組み込み機能についてよく理解してください。 dequequeue モジュール。 多くの場合、これらは幅広い要件に対応し、時間を節約し、潜在的なエラーを減らします。

さらに詳しく: Python の高度なキューの概念

キューの基本的な仕組みを理解し、より深く掘り下げたいと考えている人のために、Python はキューベースの操作を洗練し最適化するための高度な概念とテクニックを豊富に提供します。 これらの洗練された側面のいくつかを明らかにして、より複雑なシナリオに取り組むためのツールの武器を提供してみましょう。

両端キュー 両端キュー

以前に調査しましたが、 deque FIFO キューとして、LIFO (Last-In-First-Out) 操作もサポートします。 これにより、O(1) の複雑さで両端から要素を追加またはポップできます。

from collections import deque dq = deque()
dq.appendleft('A') dq.append('B') dq.pop() dq.popleft() 

優先キュー 行動中

処理の順序が優先度に依存している場合に単純な FIFO キューを使用すると、非効率になったり、望ましくない結果が生じる可能性があります。そのため、アプリケーションで、何らかの基準に基づいて特定の要素を他の要素よりも前に処理する必要がある場合は、 PriorityQueue。 これにより、設定された優先順位に基づいて要素が処理されるようになります。

キューに追加する要素の優先順位をどのように設定するかを見てみましょう。 これには、タプルを引数として渡す必要があります。 put() 方法。 タプルには、最初の要素として優先度が含まれ、XNUMX 番目の要素として実際の値が含まれている必要があります。

import queue pq = queue.PriorityQueue()
pq.put((2, "Task B"))
pq.put((1, "Task A")) pq.put((3, "Task C")) while not pq.empty(): _, task = pq.get() print(f"Processing: {task}")

これにより、次のことがわかります。

Processing: Task A
Processing: Task B
Processing: Task C

キューに格納されているものとは異なる順序で要素を追加したことに注目してください。 それは、 put() 優先キューに要素を追加するときのメソッド。

循環キューの実装

循環キュー (またはリング バッファ) は、最後の要素が最初の要素に接続され、循環フローが保証される高度なデータ構造です。 deque を使用してこの動作を模倣できます maxlen プロパティ:

from collections import deque circular_queue = deque(maxlen=3)
circular_queue.append(1)
circular_queue.append(2)
circular_queue.append(3) circular_queue.append(4)
print(circular_queue) 

まとめ

キューは基本的でありながら強力であり、現実世界のさまざまなアプリケーションや計算問題にその本質があります。 オペレーティング システムでのタスクのスケジュール設定から、印刷スプーラーや Web サーバーのリクエストでのデータ フローの管理に至るまで、キューの影響は広範囲に及びます。

Python は、キューを操作するためのツールとライブラリの豊富なパレットを提供します。 迅速なスクリプト用の単純なリストベースのキューから、非常に効率的なキューまで deque パフォーマンスが重要なアプリケーションの場合、この言語はさまざまなニーズに真に応えます。

スポット画像

最新のインテリジェンス

スポット画像