Closed9
Pythonでキューのメモ
参考
list
collections.deque
queue.Queue
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
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
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
- どれも追加は速い
- listは取り出しが遅い(リスト内のすべての要素を前にシフトさせる必要がある=O(n)であるため)
- スレッドセーフなのは
queue.Queue
だけ
キューを活用するようなユースケース
- FIFO(先入れ先出し)でデータを処理したい
- スレッドやプロセス間で安全にデータを共有したい
- 非同期処理(asyncio)でデータを順番に処理したい
- 優先度をつけて処理を管理したい
- 処理を効率的に行いたい
並行・並列処理でやはり使いたくなるよね
スレッド間通信ならqueue.Queue
マルチプロセスならこれ
非同期だとこれ
その他
優先度をつけたいならqueue.PriorityQueue
やheapq
LIFO(スタック)で使いたいならqueue.LifoQueue
スケジューラーもある意味キューと言えるかもしれない
以下も踏まえて少し色々やってみる
このスクラップは2025/02/10にクローズされました