Closed9

Pythonでキューのメモ

kun432kun432

list

q = []  # リストをキューとして使う

# キューに追加
for i in range(1000):
    q.append(i)

# キューから取り出し
print(q.pop(0))
print(q.pop(0))
print(q.pop(0))
print(q.pop(0))
print(q.pop(0))
出力
0
1
2
3
4
kun432kun432

collections.deque

from collections import deque

q = deque()

# キューに追加
for i in range(1000):
    q.append(i)

# キューから取り出し
print(q.popleft())
print(q.popleft())
print(q.popleft())
print(q.popleft())
print(q.popleft())
出力
0
1
2
3
4
kun432kun432

queue.Queue

import queue

q = queue.Queue()

# キューに追加
for i in range(1000):
    q.put(i)

# キューから取り出し
print(q.get())
print(q.get())
print(q.get())
print(q.get())
print(q.get())
出力
0
1
2
3
4
kun432kun432
  • どれも追加は速い
  • listは取り出しが遅い(リスト内のすべての要素を前にシフトさせる必要がある=O(n)であるため)
  • スレッドセーフなのはqueue.Queueだけ
kun432kun432

キューを活用するようなユースケース

  • FIFO(先入れ先出し)でデータを処理したい
  • スレッドやプロセス間で安全にデータを共有したい
  • 非同期処理(asyncio)でデータを順番に処理したい
  • 優先度をつけて処理を管理したい
  • 処理を効率的に行いたい
kun432kun432

その他

優先度をつけたいならqueue.PriorityQueueheapq

https://docs.python.org/ja/3.13/library/queue.html#queue.PriorityQueue

https://docs.python.org/ja/3.13/library/heapq.html

LIFO(スタック)で使いたいならqueue.LifoQueue

https://docs.python.org/ja/3.13/library/queue.html#queue.LifoQueue

スケジューラーもある意味キューと言えるかもしれない

https://docs.python.org/ja/3.13/library/sched.html#sched.scheduler.queue

このスクラップは2025/02/10にクローズされました