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 的結果。
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
對於一般的使用情境,大概知道第一種 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()
如果你是 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)
處理資料的時候最常用 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,就能輕輕鬆鬆地看到目前函數被應用在整組資料上的比例或進度了。
是不是很不錯呢?其實 tqdm 官方的 github 提供了非常多應用的場合及範例程式碼,也維護得非常用心,本身的實用性又高,真的不愧是星星數破萬的套件。
時隔四年多 求版主能再更新一次
更新27了~麻煩><
是指下載的網頁嗎?
嗨嗨,你的名字也太可愛XD 可以試試看最…
已更新,感謝!