皆さんは、長いループ処理があるプログラムを作った際に、ちゃんと動いているか不安になったことはないでしょうか?
また、進んでいたとしてもあとどれくらいで終わるのか分からないと目途を立てにくいですよね?
プログラムを動かしてなかなか結果が出ないと不安になるんだよな~。
じゃあ、「進捗状況の表示(プログレスバー)」を使うといいよ!
では今回は、Pythonでループ処理の進捗状況をプログレスバーとして表示させる方法について紹介します。
プログレスバーを使用すると、下のようにどこまでループが進んだのかを確認出来ます。
進捗状況が確認できると、ちゃんとプログラムが動いていると安心できるし、何よりどれくらいで終わるのかぱっと見で分かるのが嬉しいですね!
では、解説していきます。
Pythonで進捗状況を表示させる基本操作(tqdm)
Pythonのループ処理で進捗状況を表示させるには、「tqdm」というライブラリを使用します。
そしてコード自体は簡単で、下のように「forのループ対象にtqdmを付ける」だけで使用できます。
for 変数 in tqdm(ループ対象):
では、実際にコードを確認してみましょう!
from tqdm import tqdm
import time
for i in tqdm(range(10)):
time.sleep(0.2)
上のコードを実行すると、ちゃんとプログレスバーで進捗状況を確認出来ましたね!
また、range以外でも、「for」を使ったループ処理なら何でも使用することが出来ます!
他の例を見てみましょう!
# listを用いたループ
testl = ["test1", "test2", "test3", "test4", "test5"]
for l in tqdm(testl):
time.sleep(1)
このように、「ループの処理にある程度時間がかかる」または「ループの数が多い」場合は、「tqdm」を用いてプログレスバーを表示させることで簡単に進捗状況を確認できるので便利です!
ちなみに、ループ処理については下の記事で基本をまとめていますので、気になる方はそちらもご覧ください。
tqdmのプログレスバーに名前を表示させよう(desc)
先ほどの解説で基本は抑えましたので、次はプログレスバーに名前をつけてみましょう!
プログレスバーに名前を表示させるには、「tqdm」を使用する時に「desc=」で指定します。
for 変数 in tqdm(ループ対象, desc=名前):
ではこれも実際にコードを動かして確認してみましょう!
from tqdm import tqdm
import time
for i in tqdm(range(10), desc="テストケース"):
time.sleep(0.2)
すると、下のようにプログレスバーの前に指定した名前が表示されます!
では、どういう時に使用するかというと、ループが複数あったり2重になっている場合に役立ちます!
例えば、下のようにケースですね。
from tqdm import tqdm
import time
testl = ["test1", "test2", "test3"]
for l in testl:
for i in tqdm(range(10), desc=l):
time.sleep(0.2)
こういう2重ループなどでは、プログレスバーに名前を付けることで、どこまで進んだかか確認しやすくなります。
whileを用いたループでtqdmを使用する方法(プログレスバーの作成)
「tqdm」は、「ループ対象の最大の数」を読み取ってプログレスバーを表示させるので、「while」のように上限が決まっていないループでは使用することが出来ません。
ただし、上限に目途が立っていたり、大まかにでも進捗が知りたいということであれば方法があります!
下のようにプログレスバーを作成し、更新まで記述することで使用することが出来ます。
pbar = tqdm(total=最大の数)
while 条件:
ループ内の処理
pbar.update()
pbar.close()
先ほどの説明したように、上限に目途が立っていたり、大まかにでも進捗が知りたいとい場合にしか使えませんが、このようにプログレスバーを作成し、更新箇所を記述することで使用することが出来ます。
では、実際にコードで使用例を確認してみましょう!
i = 0
pbar = tqdm(total=10)
while i<10:
i += 1
time.sleep(0.2)
pbar.update()
pbar.close()
このように書くことで、「while」を用いてループでも進捗状況を確認することが出来ます。
※今回のケースであれば素直にfor文でループした方がいいですが。
いずれにせよ、「while」を用いたループでは「tqdm」は使用しずらいですが、それでも使用したい場合は今回の方法を用いることで進捗状況を表示させることが出来ます。
進捗状況が表示されない場合の対処法(最大値を自分で指定)
最後に、前述の方法で「tqdm」を用いても進捗状況が表示されない場合の対処法について解説します。
for文のループ対象の最大数をうまく読み取れない場合、プログレスバーが表示できないことがあります。
例えば、「pandas」をループさせる際に「iterrow」でループさせると、下のように上手くプログレスバーを表示させることが出来ません。
このように、「tqdm」がうまく最大を読み取れない場合は、「total=」で指定することで表示させることが出来ます!
for 変数 in tqdm(ループ対象, total=最大数):
では、実際にコードを動かして確認してみましょう!
from tqdm import tqdm
import time
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(10, 5))
for row in tqdm(df.iterrows(), total=10):
time.sleep(0.2)
「total=」で最大値を指定することで、下のようにちゃんと表示させることが出来ました。
まとめ
今回は、「tqdm」を用いてループの進捗状況を表示させる方法について解説しました。
まとめると、以下のような内容でしたね。
- 「for 変数 in tqdm(ループ対象):」とすることで、進捗状況が表示できる
- プログレスバーに名前を付けるには「desc=名前」で指定する
- 「while」文に使用するには、「pbar = tqdm(total=最大の数)」としてプログレスバーを作る
- まくプログレスバーが表示されない場合は「total=」で最大数を指定する
プログラミングに慣れてきて、徐々に長いプログラムを書いていると、動かした際に進捗状況を確認したくなる場面が必ずあるので、その時は今回の内容を思い出してもらえると幸いです。
また、このサイトでは初心者の方向けに「プログラミングのお勧め学習法」も紹介していますので、気になった方はそちらもご覧いただけると幸いです。
コメント