1 tqdm介绍
tqdm
是一个快速、可扩展的Python进度条库,用于在Python长循环中添加一个进度提示信息,用户只需封装任何迭代器 tqdm(iterator)
。其名字来源于阿拉伯语单词 "taqaddum"(تقدّم)的缩写,意为“进步”或“进展”。tqdm
在各种环境中均有优秀表现,包括终端、Jupyter Notebook以及图形界面等。
tqdm
是一个强大的工具,它简单易用,高度可定制,适合于各种循环任务,特别是在数据处理和机器学习领域中。通过使用tqdm
,开发者可以提供更好的用户体验,准确地展示程序的执行进度。
1.1 基本特性
tqdm的基本特性如下所述:
-
易用性:
tqdm
的使用非常简单,通常只需在循环的迭代器上添加tqdm()
。只需在 Python 循环中包裹你的迭代器,一行代码就能产生一个精美的进度条。 -
灵活性:兼容广泛的迭代环境,包括列表、文件、生成器等。它可以和 for 循环、pandas dataframe的 apply 函数以及 Python 的 map 函数等等配合使用。
-
高效性:对代码的运行效率影响极小。tqdm 使用了智能算法,即使在数据流非常快的情况下,也不会拖慢你的代码速度。
-
可定制性:允许用户自定义进度条的各种属性,如进度条长度、格式等。
1.2 安装和使用
安装 tqdm
非常简单,可以使用 pip:
pip install tqdm
在代码中使用 tqdm
,你只需要将迭代器传递给 tqdm()
函数。例如,用于基本的 for 循环:
from tqdm import tqdm for i in tqdm(range(10000)):
# 执行某些操作
1.3 应用场景
-
数据处理:在对大型数据集进行处理时,使用
tqdm
显示进度。 -
模型训练:在机器学习或深度学习模型训练过程中,用于追踪训练进度。
-
文件处理:在读写大文件时,显示处理进度。
-
网络请求:在处理长时间的网络请求时,用于显示进度信息。
1.4 高级功能
-
嵌套循环:
tqdm
支持嵌套循环的进度显示,只需在内部循环中也加上tqdm()
。 -
手动更新:可以手动更新进度条,这在进度信息不是定期更新时非常有用。
-
在Jupyter Notebook中使用:
tqdm
提供了一个专门的tnrange()
函数,用于在Jupyter Notebook环境中更好地显示进度条。 -
自定义样式:用户可以自定义进度条的布局、颜色等。
1.5 tqdm
的优点
-
易于使用:
tqdm
非常简单易用,只需几行代码即可在循环中添加一个进度条。 -
灵活性:它可以在各种循环中使用,包括 for 循环、列表解析式,甚至是 Pandas DataFrame 的 apply 函数。
-
自定义性:
tqdm
提供多种定制选项,如进度条的长度、进度单位、进度条样式等。 -
轻量级:
tqdm
非常轻量,对程序的性能影响极小。 -
实时更新:它能实时显示进度,包括已经过去的时间、预估剩余时间和当前速率。
-
广泛的兼容性:
tqdm
可以在命令行界面 (CLI) 和图形用户界面 (GUI) 中使用,甚至可以集成到 Jupyter Notebooks 中。 -
丰富的文档和社区支持:
tqdm
拥有详细的文档和活跃的社区,方便用户学习和解决问题。
1.6 tqdm常见参数
tqdm的常见参数有:
-
desc('str'): 传入进度条的前缀
-
mininterval(float):最小的更新时间 [default: 0.1] seconds
-
maxinterval(float):最大的更新时间 [default: 10] seconds. 只有在dynamic_miniters
-
miniters(int or float):最小的展示更新进度,如果设置为0或者是dynamic_miniters程序会自动的调整去让miniterval与它项适应
-
ascii(bool or str):如果调整为True的话会使用ASCII(美国信息交换标准代码)码,默认为False会使用unicode
-
ncols(int):整个输出信息的宽度
-
nrows(int):进度条的高速
-
dynamic_ncols(bool):会在环境中持续改变ncols和nrows
-
smoothing(float):会平均移动因素和预计的时间
-
bar_format(str):可以自己定义一个
-
position(int):设置打印进度条的位置,可以设置多个bar
-
colour(str):进度条的颜色
-
set_postfix : 设置信息
1.7 注意事项
- 在多线程或多进程环境中使用
tqdm
可能需要额外的配置。 - 进度条的更新频率过高可能会影响程序性能,特别是在非常快的循环中。
- 在某些文本环境(如某些IDE的控制台)中,进度条的显示可能会有所不同。
2 tqdm使用示例
2.1 tqdm直接传入可迭代对象
import time
from tqdm import tqdm
for i in tqdm(range(60)):
print('step i:', i)
time.sleep(0.01)
运行结果显示如下:(默认情况下,0.1s打印一次进度信息)
0%| | 0/60 [00:00<?, ?it/s]step i: 0
step i: 1
step i: 2
step i: 3
step i: 4
step i: 5
step i: 6
10%|█ | 6/60 [00:00<00:00, 58.99it/s]step i: 7
step i: 8
step i: 9
step i: 10
step i: 11
step i: 12
......
80%|████████ | 48/60 [00:00<00:00, 63.53it/s]step i: 49
step i: 50
step i: 51
step i: 52
step i: 53
step i: 54
92%|█████████▏| 55/60 [00:00<00:00, 63.35it/s]step i: 55
step i: 56
step i: 57
step i: 58
step i: 59
100%|██████████| 60/60 [00:00<00:00, 63.08it/s]
2.2 使用trange(i)
相当于tqdm(range(i))
的简单写法
from tqdm import trange
import time
for t in trange(60):
print('step i:', t)
time.sleep(0.01)
运行结果显示如下:
0%| | 0/60 [00:00<?, ?it/s]step i: 0
step i: 1
step i: 2
step i: 3
step i: 4
step i: 5
step i: 6
10%|█ | 6/60 [00:00<00:00, 57.70it/s]step i: 7
step i: 8
step i: 9
step i: 10
step i: 11
step i: 12
step i: 13
22%|██▏ | 13/60 [00:00<00:00, 61.68it/s]step i: 14
......
80%|████████ | 48/60 [00:00<00:00, 63.89it/s]step i: 48
step i: 49
step i: 50
step i: 51
step i: 52
step i: 53
step i: 54
92%|█████████▏| 55/60 [00:00<00:00, 63.78it/s]step i: 55
step i: 56
step i: 57
step i: 58
step i: 59
100%|██████████| 60/60 [00:00<00:00, 63.41it/s]
2.3 使用update
手动控制进度条更新的进度
from tqdm import tqdm
import time
pbar = tqdm(total=100)
for i in range(10): # 总共更新 10 次
print('step i:', i)
pbar.update(10) # 每次更新步长为 10
time.sleep(1)
运行结果显示如下:
step i: 0
20%|██ | 20/100 [00:01<00:04, 19.93it/s]step i: 1
30%|███ | 30/100 [00:02<00:04, 14.03it/s]step i: 2
step i: 3
50%|█████ | 50/100 [00:04<00:04, 11.26it/s]step i: 4
60%|██████ | 60/100 [00:05<00:03, 10.77it/s]step i: 5
step i: 6
80%|████████ | 80/100 [00:07<00:01, 10.29it/s]step i: 7
step i: 8
100%|██████████| 100/100 [00:09<00:00, 10.09it/s]step i: 9
100%|██████████| 100/100 [00:10<00:00, 9.91it/s]
2.4 使用write更新进度信息
from tqdm import trange, tqdm
import time
pbar = trange(10)
for i in pbar:
time.sleep(1)
if not (i % 2):
tqdm.write('finish task %i' % i)
运行代码显示如下:
10%|█ | 1/10 [00:01<00:09, 1.01s/it]finish task 0
30%|███ | 3/10 [00:03<00:07, 1.01s/it]finish task 2
50%|█████ | 5/10 [00:05<00:05, 1.01s/it]finish task 4
70%|███████ | 7/10 [00:07<00:03, 1.01s/it]finish task 6
90%|█████████ | 9/10 [00:09<00:01, 1.01s/it]finish task 8
100%|██████████| 10/10 [00:10<00:00, 1.01s/it]
2.5 通过set_description
和set_postfix
设置进度条显示信息
from random import random, randint
from tqdm import trange
import time
with trange(10) as t:
for i in t:
print('step i:', i)
t.set_description("GEN %i" % i) # 进度条左边显示信息
t.set_postfix(loss=random(), gen=randint(1, 999), str="h", lst=[1, 2]) # 进度条右边显示信息
time.sleep(0.1)
运行代码显示如下:
GEN 0: 0%| | 0/10 [00:00<?, ?it/s, gen=853, loss=0.984, lst=[1, 2], str=h]step i: 0
step i: 1
GEN 2: 20%|██ | 2/10 [00:00<00:00, 8.97it/s, gen=542, loss=0.782, lst=[1, 2], str=h]step i: 2
GEN 3: 30%|███ | 3/10 [00:00<00:00, 9.11it/s, gen=399, loss=0.923, lst=[1, 2], str=h]step i: 3
step i: 4
GEN 5: 50%|█████ | 5/10 [00:00<00:00, 9.09it/s, gen=460, loss=0.824, lst=[1, 2], str=h]step i: 5
GEN 6: 60%|██████ | 6/10 [00:00<00:00, 9.11it/s, gen=657, loss=0.657, lst=[1, 2], str=h]step i: 6
GEN 7: 70%|███████ | 7/10 [00:00<00:00, 9.14it/s, gen=340, loss=0.791, lst=[1, 2], str=h]step i: 7
step i: 8
GEN 9: 90%|█████████ | 9/10 [00:00<00:00, 9.13it/s, gen=104, loss=0.578, lst=[1, 2], str=h]step i: 9
GEN 9: 100%|██████████| 10/10 [00:01<00:00, 9.13it/s, gen=104, loss=0.578, lst=[1, 2], str=h]