Python のデータ構造とアルゴリズム - 優先度キュー

Python のデータ構造とアルゴリズム - 優先度キュー

[[405132]]

序文

キュー ライブラリは、マルチスレッド プログラミングに適した先入れ先出し (FIFO) データ構造を提供します。これを使用して、プロデューサー スレッドとコンシューマー スレッド間でメッセージやその他のデータを安全に渡すことができます。

呼び出し元のロック処理を行い、複数のスレッドが同じ Queue インスタンスを安全かつ簡単に操作できるようにします。メモリ使用量や処理を制限するために、キューのサイズが制限される場合があります。

基本的な使い方

Queue クラスは、基本的な先入れ先出しコンテナーを実装します。 put() を使用してこのシーケンスの一方の端に要素を追加し、get() を使用してもう一方の端から要素を削除します。具体的なコードは次のとおりです。

  1. インポートキュー
  2.  
  3. q = キュー.キュー()
  4.  
  5. iが範囲(1, 10)内にある場合:
  6. q.put(i)
  7. q.empty()ではない場合:
  8. print(q.get(),終了= " " )

実行後の効果は次のようになります。

ここでは、1 から 10 までを順番にキューに追加します。先入れ先出しの原則により、出てくる順序は追加された順序と同じになります。

LIFO キュー

先入れ先出しキューが存在するため、データ構造には後入れ先出しキューが存在する必要があります。後入れ先出しキューは LifoQueue です。例は次のとおりです。

  1. インポートキュー
  2.  
  3. q = キュー.LifoQueue()
  4.  
  5. iが範囲(1, 10)内にある場合:
  6. q.put(i)
  7. q.empty()ではない場合:
  8. print(q.get(),終了= " " )

実行後の効果は次のようになります。

優先キュー

オペレーティング システムでは、多くの場合、優先度に基づいてタスクを処理します。たとえば、システムの優先度が最も高い場合は、必ず最初にシステム タスクを処理し、次にユーザー タスクを処理します。同様に、キュー ライブラリは、優先キューを処理するための PriorityQueue を提供します。

次に例を示します。

  1. インポートキュー
  2. インポートスレッド
  3.  
  4. クラスジョブ:
  5. def __init__(self, 優先度, desc ):
  6. self.priority = 優先度
  7. 自己.desc = desc  
  8. print( "新しい仕事: " , desc )
  9. 戻る 
  10.  
  11. __eq__(自分、他):
  12. 試す:
  13. self.priority == other.priorityを返す
  14. AttributeErrorを除く:
  15. 実装されていないを返す
  16.  
  17. __lt__(自分、他):
  18. 試す:
  19. self.priority > other.priorityを返す
  20. AttributeErrorを除く:
  21. 実装されていないを返す
  22.  
  23. process_Job(q)を定義します。
  24. 真の場合:
  25. 次のジョブ = q.get()
  26. 印刷( next_job.desc )
  27. タスク完了()
  28.  
  29. q = キュー.優先度キュー()
  30.  
  31. q.put(Job(5, "5つの仕事" ))
  32. q.put(Job(15, "15の仕事" ))
  33. q.put(Job(1, "1つのジョブ" ))
  34.  
  35. 労働者 = [
  36. スレッド化.Thread(ターゲット=process_Job、引数=(q,))、
  37. スレッド化.Thread(ターゲット=process_Job、引数=(q,))、
  38. ]
  39.  
  40. のために 仕事 労働者の場合:
  41. 作業.setDaemon( True )
  42. 作業.開始()
  43.  
  44. q.join ()関数

実行後の効果は次のようになります。

ここでは、値が大きいほど優先度が高くなるようにデフォルト設定されています。15 が最初に実行され、その後に 5 と 1 のタスクが実行されていることがわかります。この例では、複数のスレッドがタスクを処理している場合、get() 中にキュー内の要素の優先度に従ってタスクが処理されることを示しています。

<<:  アラスカ航空は人工知能を活用して時間、燃料、費用を節約

>>:  マッピングドローンは多くの「ファン」を獲得しており、これらの利点は刺激的です

ブログ    
ブログ    
ブログ    
ブログ    

推薦する

2頭のアルパカが頭と尻尾を切り落とし、それをくっつけてハギングフェイスリストのトップに

HuggingFace が再びオープンソースの大規模モデルのリストのトップに躍り出ました。最前列は、...

...

緩い時代は終わった:米国の自動運転規制環境は静かに厳格化している

米国の自動運転業界を取り巻く規制環境は静かに変化しつつある。過去10年間、米国は世界の自動運転分野に...

IoTとAIが出会うとき: テクノロジーの未来

人工知能(AI)は驚異的な進歩を遂げ、一般に応用可能な技術として社会に影響を与えています。しかし、初...

ビル・ゲイツ氏:GPT-5はGPT-4よりそれほど良くはならない、生成AIは限界に達した

ビル・ゲイツ氏の暴露は機械学習コミュニティで話題となっている。 「GPT-5 は GPT-4 よりそ...

「トランスフォーマー チャレンジャー」マンバはMacBookでも動く! GitHub は半日で 500 以上のスターを獲得しました

「トランスフォーマーの挑戦者」MambaがMacBookで実行できるようになりました!誰かが Git...

凌創志新は、AI商業化の閉ループを作成するための最初のデータアノテーションビジネスを立ち上げました

アジアのビッグデータおよび人工知能企業である凌創志信は、同社の伝統的なリテイン事業であるデータラベリ...

Cacti パーセンタイル監視アルゴリズム

Cactiパーセンタイル監視アルゴリズムcacti のテンプレート自体はハードディスクの使用サイズし...

GitHub のスター数が 16.9k に急上昇、MetaGPT はインターネット全体で人気に!

著者 | 王 睿平今日、大規模言語モデル技術が継続的に成熟するにつれ、専門家はそれを活用してインテリ...

最新レビュー!拡散モデルと画像編集の愛憎関係

この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...

清華大学がLLM4VGベンチマークを開発:LLMビデオタイミングポジショニングパフォーマンスの評価に使用

12月29日、大規模言語モデル(LLM)は、単純な自然言語処理から、テキスト、オーディオ、ビデオなど...

GPT-4は97回の対話で世界の諸問題を探り、P≠NPという結論を導き出した。

科学研究の分野で働く人なら、P/NP 問題についてはある程度聞いたことがあるでしょう。この問題は、ク...

マスク氏は有言実行だ!テスラブランドの人工呼吸器が「納品」、モデル3の部品で製造

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

NeurIPS 2023 入学結果が発表され、合格率は 26.1% でした

NeurIPS は世界で最も権威のある AI 学術会議の 1 つです。正式名称は Neural I...