為什麼需要進度條? #
不管是最近最紅的 AI、機器學習、資料科學,甚至是各種科學計算時,常常要處理超大規模的資料。你是不是也常遇到這種場景:一個 for
迴圈正在處理 10 萬筆資料,結果畫面一片寂靜,完全不知道程式到底跑到哪裡,只能默默等到天荒地老…… 不然就是看著螢幕滿滿的 print 畫面。
如果有一條漂亮的進度條可以即時顯示處理進度,會不會感覺程式專案瞬間專業、心情也更安心?這時候,你一定要認識超好用的 Python 套件——tqdm
!
安裝 tqdm #
先來安裝 tqdm(只需一次):
pip install tqdm
終端機版 #
1. 基礎用法 #
最基本的用法是直接把 tqdm()
包在你的 iterable
(如 list
、range
)外層,這樣每次迴圈都會自動顯示進度條:
from tqdm import tqdm
import time
for i in tqdm(range(100)):
# 假裝做一件很慢的事情
time.sleep(0.05)
只要一行包裝,馬上有專業的進度條!(而且還會自動計算剩餘時間、處理速度等資訊)
2. 手動更新進度 #
有時候你要處理的是自訂的資料流(比如逐步下載或處理大型檔案),可以用 tqdm
物件手動更新:
from tqdm import tqdm
import time
pbar = tqdm(total=50)
for i in range(50):
# 做一點事情
time.sleep(0.1)
pbar.update(1) # 每次手動加一
pbar.close()
Jupyter Notebook #
在 Jupyter Notebook / Colab 裡,也能讓進度條完美顯示(還是互動式的!):
from tqdm.notebook import tqdm
import time
for i in tqdm(range(100)):
time.sleep(0.05)
如果你是用 Jupyter,務必用 from tqdm.notebook import tqdm
,這樣進度條才會出現在 cell 下方,不會亂碼。
只要在 tqdm()
裡面加上desc=...
就可以為進度條加上說明:
from tqdm.notebook import tqdm
import time
for i in tqdm(range(100), desc="資料處理"):
time.sleep(0.05)
是不是很讚呢!?
常見迴圈範例 #
1. 處理資料集 #
from tqdm import tqdm
dataset = range(10000)
for data in tqdm(dataset, desc="處理資料"):
# 處理每一筆資料
pass
2. 批次訓練(搭配 enumerate) #
from tqdm import tqdm
for epoch in range(5):
for batch_idx, batch in enumerate(tqdm(data_loader, desc=f"Epoch {epoch+1}")):
# 訓練每一個 batch
pass
3. 多層進度條 (nested loop) #
from tqdm import trange
for i in trange(3, desc="外層"):
for j in trange(5, desc="內層", leave=False):
# 處理...
pass
4. 列表生成式也能用! #
from tqdm import tqdm
result = [x**2 for x in tqdm(range(1000))]
5. 平行處理:用 process_map 加速你的迴圈! #
如果你常常遇到「一堆資料處理太久」、「一顆 CPU 不夠力」的狀況,tqdm
內建的平行處理其實非常簡單!只要用 process_map
這個函數,立刻可以把你的函數平行運算,而且還自帶進度條。
from tqdm.contrib.concurrent import process_map
import time
def slow_function(x):
time.sleep(0.1) # 假裝很花時間
return x * x
inputs = list(range(20))
results = process_map(slow_function, inputs, max_workers=4)
print(results)
注意事項
process_map
的用法類似map
,但會自動平行運算(多核心),還會顯示進度條!max_workers
可以設定你想用幾個 CPU 核心(預設會自動偵測)。- 回傳結果和原來順序一樣,不用怕資料亂掉。
- 適合「CPU bound」的任務,例如大量計算或資料處理(如果是大量 I/O,例如下載檔案,建議用
thread_map
)。 - 如果你要在 Jupyter Notebook 裡用,有時候會遇到無法顯示進度條或異常,可考慮用
%run
方式執行py
檔。 thread_map
:適合大量 I/O 工作(如爬蟲、下載檔案)。
小技巧 #
desc="..."
參數可以幫進度條加上自訂描述。leave=False
跑完後不保留進度條(畫面更乾淨)。- 搭配
pandas
、numpy
等等也很方便。
結語 #
tqdm
幾乎可以無痛套進任何 Python 迴圈,讓你再也不用猜程式什麼時候跑完,尤其處理大量資料時非常有感。拍拍君自己做資料清理、訓練模型、甚至爬蟲任務都會用 tqdm
!
下次再也不用枯等不安啦,直接讓進度條陪你一路衝到底吧!