讓你的程式碼動起來:Python進度條神器tqdm詳解及應用範例

2023-06-05 06:01:05

各位Python高手,今天我要給大家介紹一個好用的庫,它就是:tqdm

tqdm在阿拉伯語中的意思是 "進展",所以這個庫也被稱為 "快速進展條"。不得不說,這個名字真的很有創意!

讓我們想象一下,你正在執行一個耗時的資料處理任務或者訓練一個複雜的深度學習模型。你坐在那裡,盯著螢幕,焦急地等待程式完成。這種等待的痛苦,我想你我都有切身體會。這時候,有個視覺化的進度條會不會讓你感覺好很多呢?這就是我們今天要推薦的 tqdm 庫的功能。

tqdm 是一個 Python 快速、可延伸的進度條工具庫,它有很多優點:

易於使用:只需在 Python 迴圈中包裹你的迭代器,一行程式碼就能產生一個精美的進度條。

靈活:它可以和 for 迴圈、pandas dataframe的 apply 函數以及 Python 的 map 函數等等配合使用。

高效:tqdm 使用了智慧演演算法,即使在資料流非常快的情況下,也不會拖慢你的程式碼速度。

讓我們看一下 tqdm 在機器學習任務中的應用範例:

from tqdm import tqdm
import time
for i in tqdm(range(100)):
    # 假設我們正在進行一些耗時的操作,比如訓練深度學習模型
    time.sleep(0.01)

執行這段程式碼,你會看到一個動態更新的進度條。tqdm 會告訴你還有多少項需要處理,預計剩餘時間,以及當前的處理速度。

你會看到一個動態更新的進度條。tqdm 會告訴你還有多少項需要處理,預計剩餘時間,以及當前的處理速度。

100%|██████████| 100/100 [00:01<00:00, 97.31it/s]

我們繼續深入到 tqdm 的更多使用場景和用法。

01

你是否曾在下載大檔案時,想要知道下載的進度呢?tqdm 可以很好地滿足你的需求。看看下面的程式碼:

import requests
from tqdm import tqdm
response = requests.get(url, stream=True)  # 把stream引數設定為True
file_size = int(response.headers['Content-Length'])
chunk = 1
chunk_size = 1024
num_bars = int(file_size / chunk_size)
with open(filename, 'wb') as fp:
    for chunk in tqdm(response.iter_content(chunk_size=chunk_size), total=num_bars, unit='KB', desc=filename, leave=True): 
        fp.write(chunk)

在上面的程式碼中,我們首先獲取到要下載檔案的大小。然後,我們在 tqdm 中設定總的進度條數目為檔案大小除以每個進度條代表的位元組數。這樣,當我們下載每一個位元組塊並寫入檔案時,tqdm 就會自動更新進度條。

02

在機器學習中,我們經常需要對大規模的資料進行預處理。使用 tqdm,我們可以很直觀地看到資料預處理的進度。

import pandas as pd
from tqdm import tqdm
tqdm.pandas()
# 假設我們有一個大的 dataframe,我們想要對其 'text' 列進行一些預處理
df['processed_text'] = df['text'].progress_apply(lambda x: preprocess(x))

在上面的程式碼中,我們首先通過 tqdm.pandas() 方法對pandas 進行 patch。然後,我們就可以在 pandas 的 apply 方法中使用 progress_apply,這樣就可以在資料處理的同時顯示進度條。

03

在訓練深度學習模型時,我們經常需要迭代大量的 epochs。使用 tqdm,我們可以清晰地看到模型訓練的進度。

from tqdm import tqdm
# 假設我們有一個訓練資料集 train_dataloader 和一個模型 model
for epoch in range(num_epochs):
    epoch_iterator 
= tqdm(train_dataloader, desc=
"Training (Epoch %d)"
 % epoch)
    
    for step, batch in enumerate(epoch_iterator):
        # 模型訓練的程式碼
        # ...

04

在許多情況下,我們的程式碼可能包含巢狀迴圈。在這種情況下,我們可以使用 tqdm 建立多個進度條。

from tqdm import tqdm
import time
for i in tqdm(range(100), desc="Outer loop"):
    for j in tqdm(range(10), desc="Inner loop", leave=False):
        # 執行一些耗時的操作
        time.sleep(0.01)

在這段程式碼中,我們建立了兩個進度條,一個用於外部迴圈,一個用於內部迴圈。leave=False 選項將在內部迴圈結束後刪除內部迴圈的進度條。

05

有時候,我們可能需要手動更新進度條。例如,當我們在下載檔案或處理批次資料時,我們可能一次處理多個專案。在這種情況下,我們可以使用 update 方法。

from tqdm import tqdm
import time
with tqdm(total=100) as pbar:
    for i in range(10):
        # 執行一些耗時的操作
        time.sleep(0.1)
        pbar.update(10)

在這段程式碼中,我們首先建立了一個進度條,然後在迴圈中使用 update 方法手動更新進度條的值。

以上就是 tqdm 的一些更深入的用法。你應該可以看出 tqdm 是一個非常強大的工具,無論你在做什麼,只要你需要等待,就可以使用 tqdm。希望你可以在你的程式碼中嘗試使用 tqdm,看看它如何提升你的程式設計體驗。

我們的公眾號會一直推薦有用的 Python 庫和程式設計技巧,如果你覺得我們的文章有用,請記得關注我們,以便獲取更多的內容。讓我們一起成為更好的 Python 程式設計師!