深度学习进度显示神器:tqdm详解

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_descriptionset_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]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智慧医疗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值