一、 简介
在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库的使用方法。