はじめに
Pythonで大きなデータをループで処理している時にCUIの画面では現在の状況がどうなっているのか(今はどれくらいの処理状況か?はたまた無限ループに入ったのか)わかりません。
今回はtqdmを使ったプログレスバーの表示方法についてのメモです。
tqdmとは
tqdmの特徴
tqdmには次のような特徴があります。
- 使いやすさ:基本的な使用方法は非常に簡単で、単にイテレーション可能なオブジェクトを
tqdm()
関数にラップするだけです。 - カスタマイズ可能:ディスプレイのスタイルや表示内容は、さまざまなパラメーターによってカスタマイズ可能です。バーの長さ、バーの記号、進捗のパーセンテージ表示、経過時間や残り時間の表示などを調整できます。
- 速度:
tqdm
はオーバーヘッドを最小限に抑える設計となっています。これにより、膨大な数の繰り返し処理に対しても効率的に進捗を表示することが可能です。 - 拡張性:マルチプロセスやマルチスレッド、Jupyter Notebookなど、様々な状況下での使用をサポートしています。また、ファイルのダウンロードなど、特定の操作の進捗表示に特化した便利なユーティリティ関数も提供しています。
以上の特性により、tqdm
は大量のデータを処理する際の進捗状況を視覚的に把握するのに便利なツールとなっています。また、実装が簡単なため、コードにすぐに組み込むことができます。
使い方
まず、tqdmを使用するには、pipを使ってインストールする必要があります。コマンドプロンプトやターミナルで以下のコマンドを実行します。
準備
pip install tqdm
サンプルソースコード
以下にtqdmの基本的な使い方を示します。tqdmはイテラブル(リストやジェネレータなど)を引数に取り、それをラップする新たなイテラブルを作ります。新たなイテラブルをループすると、プログレスバーが自動的に更新されます。
難しい理屈は気にせず実際にどのように動くかみてみましょう。
次がtqdmを使ったサンプルプログラムです。
from tqdm import tqdm
import time
for i in tqdm(range(100)):
time.sleep(0.01) # 何か時間のかかる処理
このコードは、0から99までの数値を順に処理し、その途中経過をプログレスバーとして表示します。time.sleep(0.01)
は、時間のかかる処理を模倣するためのもので、実際にはファイルのダウンロードや大量のデータの処理など、何かしらの時間のかかる処理に置き換えられます。
(実環境ではこの処理は省いてください)
これを実行すると
70%|██████████████████████████████████████████████████████████████████████████████▍ | 70/100 [00:07<00:03, 9.54it/s]
100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████| 100/100 [00:10<00:00, 9.62it/s]
というようにリアルタイムで進捗状態が描画されます。
Tips
tqdm
に関するTIPSです。
- tqdmはネストされたループにも対応しています。例えば、2つのループがあり、外側のループが5回、内側のループがそれぞれ20回実行される場合、それぞれにtqdmを適用することで、2つのプログレスバーを表示することができます。
tqdm(range(100), desc="Processing", ncols=100)
のように、desc
パラメータでプログレスバーの説明を、ncols
パラメータでプログレスバーの幅を指定することができます。
注意点
tqdm
は非常に便利ですがいくつか注意する点もあります。
- マルチスレッド/マルチプロセス:
tqdm
はマルチスレッドまたはマルチプロセスの環境では正しく動作しない場合があります。特にプログレスバーの進行が正確でない、または完全に動かないといった問題が生じることがあります。このような場合には、tqdm
のマルチスレッド/マルチプロセス対応バージョン(tqdm.threading_map()
やconcurrent.futures
と組み合わせた利用など)を使用することを検討してください。 - Jupyter Notebook環境: Jupyter Notebook環境では、通常の
tqdm
ではなく、tqdm.notebook.tqdm
を使用することで、より良い結果が得られます。Jupyter特有のプログレスバーが表示されます。 - 大量の小さなタスク:
tqdm
を使用して非常に多数の非常に短いタスクを行うと、プログレスバーの更新そのものがオーバーヘッドとなり、パフォーマンスに影響を及ぼす場合があります。このような場合には、更新頻度を下げるか、または必要に応じてプログレスバーを完全に無効化することを検討してください。 - リソースの解放:
tqdm
はPythonのコンテキストマネージャとしても動作します。with tqdm(total=100) as pbar:
のように使うことで、イテレーションが終わったときに自動的にリソースを解放します。プログレスバーが不要になったときに明示的にclose()
メソッドを呼び出すことも重要です。
さいごに
今回はPythonでtqdmを用いたプログレスバーの表示方法についてでした。
ビッグデータやAIでの学習とか時間がかかる処理はこうしたプログレスバーがあると便利かもしれません。
ループごとにプログレスバーを出したり、Jupyter Notebook用に専用のライブラリがあったりと便利です。注意点は書きましたが普通に使う分にはそこまで気にしなくても良いかと思います。
この記事がお役に立ったのなら嬉しいです。
最後までお読みいただきありがとうございます。