概要
単純な整数の保存から複雑なワークフローの管理まで、データ構造は堅牢なアプリケーションの基礎を築きます。 その中で、 キュー 多くの場合、興味深いものとして、またどこにでも存在するものとして現れます。 考えてみてください – 銀行の行列、ファーストフードのカウンターで順番を待っている、コンピューター システムでタスクをバッファリングしているなど、これらすべてのシナリオは行列の仕組みと共鳴します。
列の最初の人が最初にサービスを受け、新しく到着した人は最後に加わります。 これはキューが実際に動作している例です。
開発者にとって、特に Python の場合、キューはコンピューター サイエンスの教科書に登場する単なる理論的な構成要素ではありません。 これらは、多くのアプリケーションの基礎となるアーキテクチャを形成します。 プリンターでのタスクの管理から、ライブ ブロードキャストでのデータ ストリームのシームレスな確保に至るまで、キューは不可欠な役割を果たします。
このガイドでは、キューの概念を深く掘り下げ、その特性、実際のアプリケーション、そして最も重要なことに、Python でキューを効果的に実装して使用する方法を探ります。
キューのデータ構造とは何ですか?
データ構造のランドスケープをナビゲートすると、データの入力と取得に明確なルールを持つコンテナーに遭遇することがよくあります。 このうち、 キュー その優雅さと率直さが際立っています。
FIFO の原則
キューの核心は、次の条件に従う線形データ構造です。 先入れ先出し (FIFO) 原理。 これは、キューに追加された最初の要素が最初に削除されることを意味します。 これを共感できるシナリオに例えると、チケット カウンターに並ぶ顧客の列を考えてみましょう。 先に到着した人が先にチケットを受け取り、その後に到着した人は最後尾に並んで順番を待ちます。
注: キューには XNUMX つの端があります。 後部と前部。 前部は要素が削除される場所を示し、後部は新しい要素が追加される場所を示します。
基本的なキュー操作
-
Enqueue – の行為 追加 最後まで要素 (リア) キューの。
-
デキュー – の行為 除去 からの要素 フロント キューの。
-
覗き見または正面 – 多くの状況では、前要素を取り外さずに観察するだけで効果があります。 この操作により、まさにそれが可能になります。
-
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 の組み込み機能についてよく理解してください。 deque
と queue
モジュール。 多くの場合、これらは幅広い要件に対応し、時間を節約し、潜在的なエラーを減らします。
さらに詳しく: 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
パフォーマンスが重要なアプリケーションの場合、この言語はさまざまなニーズに真に応えます。
- SEO を活用したコンテンツと PR 配信。 今日増幅されます。
- PlatoData.Network 垂直生成 Ai。 自分自身に力を与えましょう。 こちらからアクセスしてください。
- プラトアイストリーム。 Web3 インテリジェンス。 知識増幅。 こちらからアクセスしてください。
- プラトンESG。 カーボン、 クリーンテック、 エネルギー、 環境、 太陽、 廃棄物管理。 こちらからアクセスしてください。
- プラトンヘルス。 バイオテクノロジーと臨床試験のインテリジェンス。 こちらからアクセスしてください。
- 情報源: https://stackabuse.com/guide-to-queues-in-python/
- :持っている
- :は
- :not
- :どこ
- $UP
- 1
- 11
- 13
- 17
- 20
- 7
- 8
- 9
- a
- 私たちについて
- それについて
- 行為
- 行動
- 実際の
- 実際に
- 追加されました
- 追加
- 高度な
- 利点
- 先んじて
- 警告
- 整列する
- すべて
- ことができます
- 既に
- また
- 常に
- 間で
- an
- および
- どれか
- 申し込み
- アプローチ
- 建築
- です
- 引数
- 到着
- アーセナル
- AS
- 側面
- 割り当てられた
- At
- 避ける
- ベース
- 基本
- BE
- なぜなら
- 初心者
- 開始
- 行動
- 有益な
- BEST
- ブロック
- 国境
- 両言語で
- もたらす
- バッファ
- 内蔵
- 焙煎が極度に未発達や過発達のコーヒーにて、クロロゲン酸の味わいへの影響は強くなり、金属を思わせる味わいと乾いたマウスフィールを感じさせます。
- by
- 缶
- 例
- 応じます
- ケータリング
- 原因となる
- 一定
- 特性
- チェック
- 選択
- 選択する
- クリア
- コレクション
- 来ます
- 説得力のある
- 複雑な
- 複雑さ
- 計算的
- コンピュータ
- コンピュータサイエンス
- コンセプト
- コンセプト
- 結論
- 同時
- 交流
- 検討
- 定数
- 含む
- コンテナ
- 基本
- カウンター
- 作成
- 基準
- 重大な
- カスタム
- Customers
- データ
- データ入力
- データ構造
- データセット
- 取引
- 深いです
- より深い
- 掘り下げる
- 厳しい
- 依存
- 設計
- 決定する
- 開発者
- 開発
- 異なります
- 混乱する
- 明確な
- do
- 下側
- 各
- 熱心な
- 効果的に
- 効率的な
- 素子
- 要素は
- 出てくる
- end
- 終了
- 確保
- 確実に
- 確保する
- エントリ
- 同等の
- エラー
- 特に
- 本質
- 本質的に
- 例
- 例外
- 明示的
- 調査済み
- 探る
- 外部
- 慣れる
- 広範囲に及ぶ
- スピーディー
- もう完成させ、ワークスペースに掲示しましたか?
- 名
- フロー
- フォーカス
- フォロー中
- フォーム
- から
- フロント
- 完全に
- 基本的な
- Gitの
- 与える
- 与え
- 素晴らしい
- 下地
- 成長する
- ガイド
- ハンドル
- ハンドリング
- 実践的な
- 持ってる
- 持って
- ことができます
- ハイ
- 非常に
- 正直な
- ホバー
- 認定条件
- How To
- しかしながら
- HTTPS
- ICON
- 理想
- if
- 描く
- 実装する
- 実装
- 実装
- 実装
- 意義
- import
- 重要なこと
- インポート
- in
- 含まれました
- を示し
- 非効率
- に
- 興味をそそる
- 概要
- 直観的な
- 問題
- IT
- ITS
- join
- ただ
- 風景
- 言語
- 大
- 姓
- 産む
- つながる
- 学習
- less
- う
- LG
- ライブラリ
- 図書館
- ような
- 限定的
- LINE
- リスト
- リスト
- ライブ
- ll
- 長い
- 見て
- make
- 管理
- 管理する
- 多くの
- 手段
- 力学
- メカニズム
- メモリ
- 方法
- メソッド
- かもしれない
- モジュール
- 他には?
- 最も
- 必要
- ニーズ
- 新作
- いいえ
- 何も
- ニュアンス
- オブジェクト
- 観察する
- of
- オファリング
- オファー
- 頻繁に
- on
- ONE
- オペレーティング
- OS
- 操作
- 業務執行統括
- 最適化
- 最適化
- or
- 注文
- その他
- その他
- 私たちの
- でる
- 成果
- パレット
- パス
- パフォーマンス
- 実行
- 人
- プラトン
- プラトンデータインテリジェンス
- プラトデータ
- プレイ
- 過多
- ポップ
- ポップス
- 潜在的な
- :
- 強力な
- 実用的
- 防ぐ
- 前に
- 原則
- 印刷物
- 優先順位
- 問題
- プロセス
- 処理済み
- 処理
- プロジェクト
- 財産
- は、大阪で
- 目的
- Python
- クイック
- 上げる
- 範囲
- RE
- 現実の世界
- 縮小
- リファイン
- 削除済み
- 除去
- 表す
- リクエスト
- 必要とする
- 要件
- 必要
- 共鳴する
- 富裕層
- リング
- 堅牢な
- 職種
- ルール
- s
- 節約
- シナリオ
- シナリオ
- スケジューリング
- 科学
- スクリプト
- シームレス
- 二番
- 役立つ
- サービスを提供
- セッションに
- いくつかの
- Shadow
- シート
- すべき
- 重要
- 意味する
- 簡単な拡張で
- 単純
- 状況
- サイズ
- So
- ソフトウェア
- ソフトウェア開発
- ソリューション
- 一部
- 洗練された
- スペース
- 専門の
- スペクトラム
- スタックアバス
- 標準
- 規格
- スタンド
- start
- 起動
- Status:
- 手順
- Force Stop
- 保存され
- 保存
- 簡単な
- ストリーム
- 構造
- 構造
- それに続きます
- サポート
- SVG
- スイッチ
- 構文
- システム
- テーブル
- タックル
- 取り
- 仕事
- タスク
- テクニック
- 教科書
- より
- それ
- 風景
- アプリ環境に合わせて
- それら
- 理論的な
- 理論
- そこ。
- ボーマン
- 彼ら
- 考える
- この
- それらの
- 介して
- チケット
- 時間
- 〜へ
- 豊富なツール群
- 遷移
- true
- 真に
- 順番
- 2
- 遍在する
- 明らかにする
- 根本的な
- 理解する
- 予測できない
- us
- つかいます
- 「DeckleBenchは非常に使いやすく最適なソリューションを簡単に見つけることができるため、稼働率が向上しコストも削減した。当社の旧システムは良かったが改善は期待していなかった。
- 値
- 多様
- さまざまな
- Ve
- 確認する
- ボリューム
- vs
- 待っています
- we
- ウェブ
- ウェブサーバー
- この試験は
- 何ですか
- ホイール
- いつ
- which
- while
- 誰
- ワイド
- 広い範囲
- 意志
- 無し
- 仕事
- ワークフロー
- ワーキング
- ラップ
- まだ
- You
- あなたの
- あなた自身
- ゼファーネット