for文の進捗を確認するためのプログレスバーについてまとめてみた

3 min read読了の目安(約2800字

pythonで使える、処理の進捗を表すプログレスバーについて調べたのでまとめました。

軽い処理なら問題ないですが、1時間近くかかる処理の進み具合がわからないと、あとどのくらい待てばいいのか、もしかしたらビジーで固まっているのかわからなくて困りますよね。

下手すると何時間、何日も処理に時間がかかる可能性もありますので、コードやマシンスペックを見直した方がいいかもしれません。

そんな時、プログレスバーを表示すると処理の進み具合がわかるので便利です。

GitHubはこちら、Google Colabはこちら

ベースとなるfor文コード

下記の約数を計算するコードをベースにしています。

処理もGoogle Colab上で4秒くらいで終わるので遅くもなく、早すぎてプログレスバーの進捗があっという間に終わることもなく、ちょうどいい感じです。

import tqdm
num = 10000000
divisor = []
count = 0

for i in range(1, num):
    if num % i == 0: 
        divisor.append(i)
        count += 1

print(f"{num}には{count}個の約数がありました。 内訳:{divisor}")

tqdm でプログレスバーを表示

for i in tqdm.tqdm(range(1, num)):

下記のように、コマンドライン上でも使える進捗バーが表示されます。

コマンドライン上で使いたい場合はこちらを使うとよいでしょう。

https://qiita.com/pontyo4/items/76145cb10e030ad8186a

ただし、for文内のprint()で改行されたり、for文を複数ネストすると、進捗バーが無駄にたくさん表示されてしまうので気を付けましょう。

https://qiita.com/kuroitu/items/f18acf87269f4267e8c1

tqdm_notebook でプログレスバーを表示

そこでnotebook用のプログレスバーを使ってみましょう。

これですと途中で改行されることがありません。

for i in tqdm.tqdm_notebook(range(1, num)):

https://qiita.com/halhorn/items/e8aaf5b63f493f038a53

ただし英語の警告文にあるように、tqdmのバージョンが5.00以降になるとこのコードは使えなくなるようなので、できれば次のコードを使いましょう。

notebook.tqdm でプログレスバーを表示

for i in tqdm.notebook.tqdm(range(1, num)):

これで警告文を回避できます。

なお、各手法の比較のために

import tqdm
()  
for i in tqdm.notebook.tqdm(xxx):  

のようにしていますが、プログレスバーを使うたびにいちいち tqdm.notebook.tqdm()と入力するのも手間なので、実際は

from tqdm.notebook import tqdm  
()  
for i in tqdm(xxx):  

のようにするといいでしょう。

同じ処理を繰り返して進捗バー表示する tqdm.notebook.trange

tqdmの公式GitHubを見ていたら、面白いものをみつけました。

今回の約数算定処理だと用途に合わないのですが、指定した回数同じ処理を繰り返しつつ進捗バー表示する、tqdm.notebook.trangeというのがあるようです。

import tqdm

divisor = []
count = 0

for i in tqdm.notebook.trange(3, desc='1st loop'):
    for i in tqdm.notebook.tqdm(range(1, num), desc='2nd loop'):
        if num % i == 0: 
            divisor.append(i)
            count += 1

print(f"{num}には{count}個の約数がありました。 内訳:{divisor}")

今回の例ですと、約数が3重に計算されるのでよくないのですが、機械学習で同じ画像を水増しのために重複して読み込むときに使えるのかな?と思いました。

以上になります、最後までお読みいただきありがとうございました。