一、 簡介
在Python語言中,tqdm庫是一個提供進度條、可迭代對象和時間差等功能的庫。它能夠幫助程序員更加直觀地了解代碼的運行進度,從而更好地優化代碼、提高效率。其中最常用的功能是進度條,它可以幫助程序員清晰地看到某個任務執行的進度情況和當前耗時。
二、 tqdm的基礎用法
假設我們有一個需要處理的可迭代對象,例如一個長度為10的列表,並進行處理。假設我們想要在處理過程中輸出進度條,代碼如下:
from tqdm import tqdm
for i in tqdm(range(10)):
do_something(i)
以上代碼將在處理過程中輸出一個進度條,另外還會顯示當前處理的進度百分比和預計剩餘時間等信息。
如果想要在處理過程中顯示更多的信息,也可以自己指定格式,例如:
from tqdm import tqdm
for i in tqdm(range(10), desc="Processing", bar_format="{l_bar}{bar} | {n_fmt}/{total_fmt} [{elapsed}<{remaining}, {rate_fmt}{postfix}]"):
do_something(i)
以上代碼中,desc參數用於指定進度條前面的標題;bar_format參數用於指定進度條的格式。其中,”l_bar”表示左邊的進度條,”bar”表示中間的進度條,”n_fmt”表示當前正在處理的數值,”total_fmt”表示總共需要處理的數值,”elapsed”表示當前的處理時間,”remaining”表示預計剩餘時間,”rate_fmt”表示處理速度,”postfix”表示進度信息的後綴。
三、 tqdm的高級用法
除了基本用法,tqdm還提供了很多高級用法,例如子進程、文件讀寫、網路傳輸等等。下面我們介紹幾種比較常用的場景:
1. 文件傳輸進度條
文件傳輸是比較常見的一個應用場景,本質上也是一種讀取操作。假設我們有一個100M大小的文件,想要在上傳或下載文件的過程中展示進度條。
from tqdm import tqdm
import requests
url = "http://test.com/test_file.zip"
res = requests.get(url, stream=True)
total_size = int(res.headers.get('content-length', 0)) # 獲取下載文件的總大小
chunk_size = 1024 # 每次傳輸的大小
bar = tqdm(total=total_size, unit='B', unit_scale=True) # 初始化進度條
with open('test_file.zip', 'wb') as f:
for chunk in res.iter_content(chunk_size=chunk_size):
if chunk: # filter out keep-alive new chunks
f.write(chunk)
bar.update(len(chunk))
bar.close()
以上代碼中,使用requests庫下載文件,同時使用iter_content來逐步寫文件,每寫一個chunk後就調用tqdm實例的update方法,告訴進度條已經寫了多少位元組的數據。
2. 多進程並發進度條
在處理大量數據的時候,有時需要採用多進程並發的方式進行加速。比如我們需要對一個列表中的數值進行平方處理,直接使用for循環可能十分緩慢,同時需要處理大量數據,此時可以採用多進程的方式進行優化。同時在多個進程中顯示一個總體進度條,類似於以下效果:
100%|██████████| 100/100 [00:15<00:00, 6.39it/s]
實現代碼如下:
from tqdm import tqdm
import concurrent.futures
def doit(x):
return x*x
def parallel_process(array, function, n_jobs=2):
if n_jobs<=0:
n_jobs = max(1, len(array)//(len(array)//n_jobs))
with concurrent.futures.ProcessPoolExecutor(max_workers=n_jobs) as executor:
results = list(tqdm(executor.map(function, array),
total=len(array),
desc=f"Multi-process computation",
unit="element",
ncols=90))
return results
if __name__ == '__main__':
array = list(range(100))
result = parallel_process(array, doit)
以上代碼中,我們採用concurrent.futures庫中的map方法對列表array進行處理,同時使用ProcessPoolExecutor來開啟多進程,每個進程處理一個元素,最後返回處理結果。在使用tqdm來顯示總體進度條,同時設置ncols參數來控制展示的寬度。
四、 小結
本文介紹了tqdm的使用方法,從基礎用法到高級用法都進行了詳細的講解。在實際編程過程中,tqdm可以幫助程序員實現了解程序運行進度的同時,對優化代碼、提高效率、並發處理提供了簡潔而powerful的助力。希望本文能夠為讀者提供有益的信息和引導,幫助大家更好地掌握tqdm庫的使用方法。
原創文章,作者:ASVEQ,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/370155.html