LoginSignup
17
13

More than 5 years have passed since last update.

ループ処理の進捗を確認するためにプログレスバーを表示する

Posted at

はじめに

先日、pythonでデータの整形をする際、for分を回す場面があったのですが、予想以上に処理が重く6分程度かかるforを回していました。長い処理をさせると、フリーズしているのでないか不安になりますので、プログレスバーを表示させたいと思いました。

参考

手順

tqdmモジュールを使用します。

from tqdm import tqdm
import time

for i in tqdm(range(365)):
    # ここに処理を書く

# 下記のようなプログレスバーが表示される
#  55%|█████▌    | 202/365 [04:57<04:03,  1.50s/it]

下記でも同じことが実現できます。

for i in trange(365):
    # ここに処理を書く

tarangetqdm(range(i))の最適化されたインスタンスです。

forループでは要素と同時にインデックスを取得したい場合があります。enumerateを使用する場合は、enumerate(tqdm(...))と書きます。tqdm(enumerate(...))ではないようです。

for i,j in enumerate(tqdm(range(100))): # iがenumerate、jがrange
    # ここに処理を書く

ネストのループにも対応しています。

from tqdm import trange
from time import sleep

for i in trange(10, desc='1st loop'):
    for j in trange(5, desc='2nd loop', leave=False):
        for k in trange(100, desc='3nd loop'):
            # ここに処理を書く

descはプログレスバーのプレフィックスです。leaveをTrueにするとループが終わるまでプログレスバーが進み続けます。

pandasのapplyにもプログレスバーを表示させることができます。

import pandas as pd
import numpy as np
from tqdm import tqdm

df = pd.DataFrame(np.random.randint(0, 100, (100000, 6)))

# Register `pandas.progress_apply` and `pandas.Series.map_apply` with `tqdm`
# (can use `tqdm_gui`, `tqdm_notebook`, optional kwargs, etc.)
tqdm.pandas(desc="my bar!")

# Now you can use `progress_apply` instead of `apply`
# and `progress_map` instead of `map`
df.progress_apply(lambda x: x**2)
# can also groupby:
# df.groupby(0).progress_apply(lambda x: x**2)

jupyter notebookを使用している場合は、グラフィカルなプログレスバーが表示されます。

from tqdm import tnrange, tqdm_notebook
from time import sleep

for i in tnrange(10, desc='1st loop'):
    for j in tqdm_notebook(xrange(100), desc='2nd loop'):
        sleep(0.01)
17
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
13