tqdm 是一个快速、可扩展的Python进度条库,用于在Python长循环中添加一个进度提示信息,用户只需封装任何迭代器 tqdm(iterator)。其名字来源于阿拉伯语单词 "taqaddum"(تقدّم)的缩写,意为“进步”或“进展”。tqdm在各种环境中均有优秀表现,包括终端、Jupyter Notebook以及图形界面等。
tqdm是一个强大的工具,它简单易用,高度可定制,适合于各种循环任务,特别是在数据处理和机器学习领域中。通过使用tqdm,开发者可以提供更好的用户体验,准确地展示程序的执行进度。

tqdm的基本特性如下所述:
易用性:tqdm的使用非常简单,通常只需在循环的迭代器上添加tqdm()。只需在 Python 循环中包裹你的迭代器,一行代码就能产生一个精美的进度条。
灵活性:兼容广泛的迭代环境,包括列表、文件、生成器等。它可以和 for 循环、pandas dataframe的 apply 函数以及 Python 的 map 函数等等配合使用。
高效性:对代码的运行效率影响极小。tqdm 使用了智能算法,即使在数据流非常快的情况下,也不会拖慢你的代码速度。
可定制性:允许用户自定义进度条的各种属性,如进度条长度、格式等。
安装 tqdm 非常简单,可以使用 pip:
pip install tqdm
在代码中使用 tqdm,你只需要将迭代器传递给 tqdm() 函数。例如,用于基本的 for 循环:
- from tqdm import tqdm for i in tqdm(range(10000)):
- # 执行某些操作
数据处理:在对大型数据集进行处理时,使用 tqdm 显示进度。
模型训练:在机器学习或深度学习模型训练过程中,用于追踪训练进度。
文件处理:在读写大文件时,显示处理进度。
网络请求:在处理长时间的网络请求时,用于显示进度信息。
嵌套循环:tqdm 支持嵌套循环的进度显示,只需在内部循环中也加上 tqdm()。
手动更新:可以手动更新进度条,这在进度信息不是定期更新时非常有用。
在Jupyter Notebook中使用:tqdm提供了一个专门的tnrange()函数,用于在Jupyter Notebook环境中更好地显示进度条。
自定义样式:用户可以自定义进度条的布局、颜色等。
1.5 tqdm 的优点易于使用:tqdm 非常简单易用,只需几行代码即可在循环中添加一个进度条。
灵活性:它可以在各种循环中使用,包括 for 循环、列表解析式,甚至是 Pandas DataFrame 的 apply 函数。
自定义性:tqdm 提供多种定制选项,如进度条的长度、进度单位、进度条样式等。
轻量级:tqdm 非常轻量,对程序的性能影响极小。
实时更新:它能实时显示进度,包括已经过去的时间、预估剩余时间和当前速率。
广泛的兼容性:tqdm 可以在命令行界面 (CLI) 和图形用户界面 (GUI) 中使用,甚至可以集成到 Jupyter Notebooks 中。
丰富的文档和社区支持: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 : 设置信息
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]
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]
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]
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]
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]