0. 前言
学习深度学习神经元网络时接触到tqdm模块,在训练大型网络时需要等很长时间,tqdm能把训练的进度及预估完成时间可视化展现出来。推而广之,只要在涉及到大型循环运行的代码,tqdm模块都是一个很好用的可视化进度条工具。对于用户来说,看到进度条可以让他们了解任务正在进行,而不是程序卡住或无响应。这提高了用户对应用程序的信任和满意度。
1. tqdm介绍
tqdm是阿拉伯语taqaddum(意为“进度”)的缩写,也是西班牙语“I love you so much”的缩写
tqdm derives from the Arabic word taqaddum (تقدّم) which can mean “progress,” and is an abbreviation for “I love you so much” in Spanish (te quiero demasiado).
tqdm是一个在Python中广泛使用的进度条库。以下是对tqdm库的主要特点和使用介绍:
1.1 功能:
- tqdm提供了一个直观的命令行进度条,可以在循环或迭代过程中显示任务的完成进度。
- 进度条会动态更新,显示已处理的项数、总体估计时间和剩余时间等信息。
- 它可以与任何迭代器或生成器一起使用,只需要将迭代器包裹在tqdm(iterator)函数中即可。
1.2 易用性:
- 使用tqdm非常简单,无需复杂的配置,只需在需要显示进度的地方插入一行代码即可。
- 它可以无缝集成到你的代码中,不需要对现有逻辑进行重大修改。
1.3 定制化:
- tqdm允许用户自定义进度条的样式和行为,包括但不限于:
- 设置总体任务的数量(如果已知)。
- 修改显示格式,包括显示百分比、ETA(预计到达时间)、速度等。
- 设置进度条的颜色、大小和位置。
- 添加自定义消息和标签。
1.4 并行支持:
- tqdm支持多线程和多进程的进度跟踪,可以方便地在并行计算环境中显示各个任务的进度。
1.5 智能暂停和恢复:
- 当终端输出被其他内容覆盖时,tqdm可以智能地暂停和恢复进度条的显示。
1.6 适应性强:
- tqdm可以在各种环境下工作,包括Jupyter Notebook、IPython console、普通的命令行界面等。
2. tqdm使用实操
2.1 循环进度跟踪
非常简单,只要把要循环的内容嵌套在tqdm中即可,例:
from tqdm import tqdm import time l = ['a','b','c','d','e'] for i in tqdm(range(5)): print(i) time.sleep(1) for j in tqdm(l): time.sleep(1)
这样就可以看到循环语句的进度条了:
这里可以看到相关的时间参数:已进行时间/剩余预估时间/每次循环需要时间。
2.2 并行计算进度跟踪
tqdm也支持并行计算的进度跟踪。
from concurrent.futures import ThreadPoolExecutor from tqdm import tqdm def long_running_task(num): time.sleep(0.1) # 模拟耗时操作 return num * num with ThreadPoolExecutor() as executor: futures = {executor.submit(long_running_task, num) for num in range(100)} for future in tqdm(as_completed(futures), total=len(futures)): result = future.result() print(result)
在这个例子中,我们使用了concurrent.futures
库进行多线程计算,并使用tqdm
来跟踪每个任务的完成情况。as_completed
函数返回的是一个生成器,我们可以将其传递给tqdm
来显示进度条。
2.3 tqdm自定义参数
可以通过传递参数来自定义进度条的行为和样式。
from tqdm import tqdm import time # 设置总任务数为100 total_tasks = 100 # 自定义进度条的描述信息和单位 for i in tqdm(range(total_tasks), desc='Processing tasks', unit='task'): time.sleep(0.1) # 模拟耗时操作 # 设置进度条的样式和格式 for i in tqdm(range(total_tasks), bar_format='{l_bar}{bar}| {n_fmt}/{total_fmt} [elapsed: {elapsed} remaining: {remaining}]'): time.sleep(0.1)
在这个例子中,我们设置了进度条的描述信息为"Processing tasks",单位为"task"。在第二个循环中,我们还修改了进度条的显示格式,包括当前进度、总任务数、已用时间和剩余时间。