您的位置:

from tqdm import tqdm的全面解析

一、 简介

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