Pythonでプログレスバーを表示する|tqdmのいろいろな使い方
![](https://tech.aru-zakki.com/wp-content/uploads/2024/01/tqdm.001.jpeg)
プログレスバーで進捗状況を表示させるライブラリ(tqdm)の使い方をチートシートっぽくまとめました。私自身、毎回使い方がわからなくなってネットを検索するのですが、私が欲しい情報が集まっている記事がなかったので作成しました。
tqdmとは
Pythonでデータ処理や機械学習を行うと、処理に時間がかかることがよくあります。このような場合、「進捗状況がわかればいいのに」と感じることがあります。
そんな時に役に立つのがtqdmです。tqdmを使うと、進捗状況をプログレスバーで表示することができます。
tqdmは簡単に導入でき、「データ読み込みがどれくらいで終了するか」や「どこまで処理が進んでいるか」などを視覚的に表示することができます。
プログレスバーの動作例
![tqdmの動作サンプル](https://tech.aru-zakki.com/wp-content/uploads/2024/02/progressbar4-1024x97.gif)
インストール
tqdmのインストールはpip
で行うことができます。
pip install tqdm
インポート
ライブラリのインポート
tqdmを使う場合は、以下のようにtqdm.tqdm
をインポートします。
from tqdm import tqdm
ライブラリのインポート(jupyter notebookの場合)
なお、jupyter notebook, google colabの場合は、tqdm
の代わりにtqdm.notebook
を利用します。
Google Colab, Jupyter notebookの場合
from tqdm.notebook import tqdm
基本的な使い方
for文でtqdmを利用する
オーソドックスな使い方だと思います。
for文にtqdm(...)
を加えるだけでプログレスバーが表示できます。
rangeで数を指定
for xx in range(..)
の形式で利用する場合は、range
をtqdmで囲むだけです。
from tqdm import tqdm
import time
for i in tqdm(range(100)):
time.sleep(0.1)
![プログレスバー(動画)](https://tech.aru-zakki.com/wp-content/uploads/2024/02/progressbar.gif)
要素数分だけループ
for xx in リスト
の形式でも利用することができます。この場合も、tqdmで囲むだけです。
from tqdm import tqdm
import time
x = ['a', 'b', 'c', 'd', 'e', 'f']
for e in tqdm(x):
time.sleep(1)100%|██████████| 6/6 [00:06<00:00, 1.00s/it
100%|██████████| 100/100 [00:10<00:00, 9.81it/s]
with tqdm(…) as …を利用する
プログレスバーに対して、細かな設定をしたい場合は、with tqdm(...) as ...
を利用します
更新する刻み(ステップ)を指定しない場合
with tqdm...
を使う方法では、pbar
でプログレスバーの項目にアクセスできるのが利点です。
なお、この方法で利用する場合は、ループ中にpbar.update()
を挿入してプログレスバーを更新する必要があります
from tqdm import tqdm
import time
with tqdm(total = 100) as pbar:
for i in range(100):
time.sleep(0.1)
pbar.update()
100%|██████████| 100/100 [00:10<00:00, 9.81it/s]
更新する刻み(ステップ)を指定する場合
pbar.update(val)
のようにvalを設定することで、プログレスバーの進捗の更新割合を指定することができます。
以下の例では10刻みでプログレスバーを更新しています。
from tqdm import tqdm
import time
with tqdm(total = 100) as pbar:
for i in range(10):
time.sleep(0.1)
pbar.update(10)
100%|██████████| 100/100 [00:01<00:00, 98.42it/s]
プログレスバーに各種情報を表示したい
プログレスバーの表示もカスタマイズすることができます
以下は、プログレスバーに、様々な情報を表示させたい場合の記述方法です
prefix(description):手前に説明を追加
固定した文字列を追加
プログレスバーの手前に文字列を追加する方法です。追加した文字列は更新されません。
プログレスバーの手前に名前をつけたい場合は以下のようにdesc=
を利用します。
from tqdm import tqdm
import time
for i in tqdm(range(100), desc="SAMPLE"):
time.sleep(0.1)
また、以下のように記述することもできます。
from tqdm import tqdm
import time
with tqdm(total = 100) as pbar:
pbar.set_description("SAMPLE") # 説明文を追加
for i in range(100):
time.sleep(0.1)
pbar.update()
以下のように、出力に対して赤文字の部分が追加されます
SAMPLE: 100%|██████████| 100/100 [00:10<00:00, 9.81it/s]
実行中に更新
文字列を更新したい場合には、pbar.set_decsription(...)
を利用します。
具体的には、以下のようにすることで、表示内容を更新することが可能となります。
from tqdm import tqdm
import time
with tqdm(total = 100) as pbar:
for i in range(10):
pbar.set_description(f"[{i}]")
for j in range(10):
time.sleep(0.1)
pbar.update()
実行すると、出力に対して赤文字の部分が追加され、進捗に併せて更新されます。
[9]: 100%|██████████| 100/100 [00:10<00:00, 9.84it/s]
postfix(suffix)
辞書型(dict)で渡す場合
値を辞書型で渡すと、key=value
の形式でプログレスバーに表示されます。
from tqdm import tqdm
import time
import random
with tqdm(total = 100) as pbar:
for i in range(100):
time.sleep(0.1)
pbar.set_postfix({"val": random.random()})
pbar.update()
以下のように、出力に対して赤文字の部分が追加されます
100%|██████████| 100/100 [00:10<00:00, 9.67it/s, val=0.709]
文字列で渡す場合
表示する文字列を渡したい場合は、以下のようにします。
from tqdm import tqdm
import time
import random
with tqdm(total = 100) as pbar:
for i in range(100):
time.sleep(0.1)
pbar.set_postfix_str(f"val:{random.random()}")
pbar.update()
以下のように、出力に対して赤文字の部分が追加されます
100%|██████████| 100/100 [00:10<00:00, 9.68it/s, val:0.41087129503640296]
その他
Pandasでプログレスバーを表示
tqdmを使って、pandasのapplyなどでもプログレスバーを表示することが可能です。この場合は、tqdm.pandas()
を実行し、その後progress_apply
を利用します。
なお、progress_apply
以外にも、progress_applymap
などのメソッドも追加されます。
pandasでapplyがどれくらいで終わるかわかるようになるので重宝します。
from tqdm.notebook import tqdm
import pandas as pd
import random
df = pd.DataFrame({"a": [random.random() for i in range(100000)]})
tqdm.pandas()
ave = df['a'].mean()
df['b'] = df['a'].progress_apply(lambda x: x - ave)
display(df.head())
![pandasでプログレスバー](https://tech.aru-zakki.com/wp-content/uploads/2024/02/image-42-1024x295.png)
プログレスバーを表示しながら、ログ表示もしたい
プログレスバーを表示しつつ、ログを表示したい場合があるかと思います。tqdm
では、プログレスバーを出力しならが、ログを出力する機能も備えています。
これには、pbar.write
を利用します
![](https://tech.aru-zakki.com/wp-content/uploads/2023/06/tabbycat.png)
私は、プログレスバーを表示しつつログ表示を多用します。途中経過などを出力するのに便利です
from tqdm import tqdm
import time
import random
with tqdm(total = 10) as pbar:
for i in range(10):
time.sleep(0.1)
r = random.random()
if r > 0.8:
pbar.write(f"Update r = {r}")
pbar.update(1)
pbar.write
で出力したログは、プログレスバーとは別に追加されます。以下の出力結果は、ログを表示した例です。例のように、プログレスバーの下にpbar.write
で出力した文字列が表示されます。
![プログレスバー(アニメーション)](https://tech.aru-zakki.com/wp-content/uploads/2024/02/progressbar2.gif)
上の出力結果は、Google Colabで以下のコードを実行した例です。tqdm.notebook
を使っていることに注意してください。
from tqdm.notebook import tqdm
import time
import random
with tqdm(total = 100) as pbar:
for i in range(100):
time.sleep(0.1)
r = random.random()
if r > 0.8:
pbar.write(f"Update r = {r}")
pbar.update()
![](https://tech.aru-zakki.com/wp-content/uploads/2023/06/tabbycat.png)
2重ループ
2重ループの場合は、tqdmを重ねるだけで大丈夫です。
2重ループさせる場合は、プログレスバーがどのループのものかわかるように、description
をつけておいた方が良いと思います。
leave=False
を指定すると、ループ終了時にプログレスバーが削除されます。内側のループは、leave=False
を指定してループ終了時に消えるようにしておいた方が、進捗が見やすくなります。
from tqdm import tqdm
import time
for i in tqdm(range(5), desc="LOOP1"):
for j in tqdm(range(100), desc="Loop2", leave=False):
time.sleep(0.01)
![2重ループ](https://tech.aru-zakki.com/wp-content/uploads/2024/02/progressbar3.gif)
まとめ
以上、私が利用している範囲でtqdmの使い方をまとめました。随時更新予定ですので、「これを追加してほしい」があればコメントください。