Python | tqdm 為你的程式加上進度條 (Progress Bar)

progressbar - Python | tqdm 為你的程式加上進度條 (Progress Bar)

Python 中的套件 tqdm 是最近最深得我心的一款,因為它能夠為你的程式加入進度條,無論是在次數龐大的迴圈中或是執行一項耗時的任務時,都能夠幫助你隨時得知目前的進度、確保電腦沒有當機。重點是它的使用方式超級簡單優雅,完全符合 python 的特質💖

tqdm在阿拉伯文中表示進度(taqadum, تقدّم),在西班牙文中又是「我太愛你了」的縮寫(te quiero demasiado),雖然有點硬要,但也是挺浪漫挺可愛的。

要使用 tqdm 這個套件,不免俗的先用 pip 安裝:

pip install tqdm

官方的 github 提供了更多不同平台上的安裝方式,若你有用 Anaconda、dock 的話,也可以參考官方提供的安裝指令。安裝完成後,就可以立刻來體驗看看它的好啦!

tqdm 有三種主要的使用方式,分別是:

  • Iterable-based
  • Manual
  • Module

第一種 Iterable-based 的方法,就是在任何 iterable 的物件前面加上 tqdm(),像這樣:

from tqdm import tqdm

text = ""
for char in tqdm(["a", "b", "c", "d"]):
    text = text + char
print(text)

如果你是用 jupyter notebook,就會看到執行這段 code 的 cell 下面,以光速跑完了進度條,並印出了將 list 迭代完後黏到變數 text 的結果。

100%|██████████| 4/4 [00:00<00:00, 8359.35it/s]
abcd

python 裡最常見的 for i in range(),你可能會想要用 tqdm(range(i)),也不是不行,不過在 tqdm 有進行優化也順便簡化了的版本 trange(i)

for i in trange(10000):
    pass

第二種是 Manual 手動模式,你可以自己指定 total 的數值,並且在做完某一件事後 update 當下的進度,像是:

with tqdm(total=100) as pbar:
    for i in range(10):
        time.sleep(0.1)
        pbar.update(10)

最後一種 Module 的方法,讓你可以在命令列裡加入 tqdm,下 command 時一樣能夠隨時掌握現在的進度!下面是一個計算所有當下目錄的 py 檔裡面的行數的例子:

$ time find . -name '*.py' -type f -exec cat \{} \; | tqdm | wc -l

857366it [00:03, 246471.31it/s]
857365

對於一般的使用情境,大概知道第一種 Iteration-based 的方法,就能夠很好的享受到 tqdm 帶來的方便與美好,但如果你想要再更多一點點,像是…

在巢狀迴圈(Nested loop)裡使用 tqdm:

import time
from tqdm import trange

def do_task1():
    time.sleep(1)

def do_task2():
    time.sleep(1)


for i in trange(2, desc='outer loop'):
    do_task1()

    for j in trange(3, desc='inner loop'):
        do_task2()

outer loop: 0%| | 0/2 [00:00<?, ?it/s]
inner loop: 0%| | 0/3 [00:00<?, ?it/s]
inner loop: 33%|███▎ | 1/3 [00:01<00:02, 1.00s/it]
inner loop: 67%|██████▋ | 2/3 [00:02<00:01, 1.00s/it]
inner loop: 100%|██████████| 3/3 [00:03<00:00, 1.00s/it]
outer loop: 50%|█████ | 1/2 [00:04<00:04, 4.02s/it]
inner loop: 0%| | 0/3 [00:00<?, ?it/s]
inner loop: 33%|███▎ | 1/3 [00:01<00:02, 1.00s/it]
inner loop: 67%|██████▋ | 2/3 [00:02<00:01, 1.00s/it]
inner loop: 100%|██████████| 3/3 [00:03<00:00, 1.00s/it]
outer loop: 100%|██████████| 2/2 [00:08<00:00, 4.02s/it]

如果你是 jupyter notebook 愛好者,可以使用 tqdm.notebook,進度條將會更加美麗:

from tqdm.notebook import trange, tqdm
from time import sleep

for i in trange(3, desc='1st loop'):
    for j in tqdm(range(100), desc='2nd loop'):
        sleep(0.01)

tqdm jupyter 1 - Python | tqdm 為你的程式加上進度條 (Progress Bar)

處理資料的時候最常用 pandas 了,如果想要對某個 column apply 一個函數,在資料量大的時候也會需要跑一陣子,這時 tqdm 又可以派上用場了:

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

df = pd.DataFrame(np.random.randint(0, 100, (100000, 6)))
tqdm.pandas(desc="applying... ")
df.progress_apply(lambda x: x**2)

你只需要加入 tqdm.pandas,並將原本的 apply 改為 progress_apply,就能輕輕鬆鬆地看到目前函數被應用在整組資料上的比例或進度了。

applying… : 100%|██████████| 6/6 [00:00<00:00, 696.75it/s]

是不是很不錯呢?其實 tqdm 官方的 github 提供了非常多應用的場合及範例程式碼,也維護得非常用心,本身的實用性又高,真的不愧是星星數破萬的套件。