Python|tqdmを使ったプログレスバーの表示方法と応用例
プログレスバーを使って進捗状況を表示するライブラリ「tqdm」の使い方を、チートシート形式でまとめました。毎回使い方がわからなくなってネットで検索することが多いのですが、自分が欲しい情報を集めた記事がなかったため、今回この記事を作成しました。tqdmを使ったプログレスバーの設定や使い方について、必要な情報を一箇所にまとめていますので、ぜひ参考にしてください。
tqdmとは
Pythonでデータ処理や機械学習を行う場合、処理に結構な時間がかかることあります。このような場合、「いったいいつ終わるの? 進捗状況がわかればいいのに」と感じることが多いでしょう。
そんな時に役立つのがtqdmです。
tqdmを使うと、進捗状況をプログレスバーで簡単に表示することができます。
tqdmは導入が簡単で、「データ読み込みがどれくらいで終了するか」や「どこまで処理が進んでいるか」などを視覚的に確認することができます。
この記事では、tqdmの使い方をいろいろ集めてみました。
プログレスバーの動作例
インストール
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)
要素数分だけループ
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())
プログレスバーを表示しながら、ログ表示もしたい
プログレスバーを表示しつつ、ログを表示したい場合があるかと思います。tqdm
では、プログレスバーを出力しならが、ログを出力する機能も備えています。
これには、pbar.write
を利用します
私は、プログレスバーを表示しつつログ表示を多用します。途中経過などを出力するのに便利です
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
で出力した文字列が表示されます。
上の出力結果は、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()
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)
まとめ
以上、私が利用している範囲でtqdmの使い方をまとめました。随時更新予定ですので、「これを追加してほしい」があればコメントください。