• 深度学习进度显示神器: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 循环:

    1. from tqdm import tqdm for i in tqdm(range(10000)):
    2. # 执行某些操作

    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直接传入可迭代对象

    1. import time
    2. from tqdm import tqdm
    3. for i in tqdm(range(60)):
    4. print('step i:', i)
    5. time.sleep(0.01)

    运行结果显示如下:(默认情况下,0.1s打印一次进度信息)

    1. 0%| | 0/60 [00:000
    2. step i: 1
    3. step i: 2
    4. step i: 3
    5. step i: 4
    6. step i: 5
    7. step i: 6
    8. 10%|█ | 6/60 [00:00<00:00, 58.99it/s]step i: 7
    9. step i: 8
    10. step i: 9
    11. step i: 10
    12. step i: 11
    13. step i: 12
    14. ......
    15. 80%|████████ | 48/60 [00:00<00:00, 63.53it/s]step i: 49
    16. step i: 50
    17. step i: 51
    18. step i: 52
    19. step i: 53
    20. step i: 54
    21. 92%|█████████▏| 55/60 [00:00<00:00, 63.35it/s]step i: 55
    22. step i: 56
    23. step i: 57
    24. step i: 58
    25. step i: 59
    26. 100%|██████████| 60/60 [00:00<00:00, 63.08it/s]

    2.2 使用trange(i)

    相当于tqdm(range(i))的简单写法

    1. from tqdm import trange
    2. import time
    3. for t in trange(60):
    4. print('step i:', t)
    5. time.sleep(0.01)

    运行结果显示如下:

    1. 0%| | 0/60 [00:000
    2. step i: 1
    3. step i: 2
    4. step i: 3
    5. step i: 4
    6. step i: 5
    7. step i: 6
    8. 10%|█ | 6/60 [00:00<00:00, 57.70it/s]step i: 7
    9. step i: 8
    10. step i: 9
    11. step i: 10
    12. step i: 11
    13. step i: 12
    14. step i: 13
    15. 22%|██▏ | 13/60 [00:00<00:00, 61.68it/s]step i: 14
    16. ......
    17. 80%|████████ | 48/60 [00:00<00:00, 63.89it/s]step i: 48
    18. step i: 49
    19. step i: 50
    20. step i: 51
    21. step i: 52
    22. step i: 53
    23. step i: 54
    24. 92%|█████████▏| 55/60 [00:00<00:00, 63.78it/s]step i: 55
    25. step i: 56
    26. step i: 57
    27. step i: 58
    28. step i: 59
    29. 100%|██████████| 60/60 [00:00<00:00, 63.41it/s]

    2.3 使用update手动控制进度条更新的进度

    1. from tqdm import tqdm
    2. import time
    3. pbar = tqdm(total=100)
    4. for i in range(10): # 总共更新 10 次
    5. print('step i:', i)
    6. pbar.update(10) # 每次更新步长为 10
    7. time.sleep(1)

    运行结果显示如下:

    1. step i: 0
    2. 20%|██ | 20/100 [00:01<00:04, 19.93it/s]step i: 1
    3. 30%|███ | 30/100 [00:02<00:04, 14.03it/s]step i: 2
    4. step i: 3
    5. 50%|█████ | 50/100 [00:04<00:04, 11.26it/s]step i: 4
    6. 60%|██████ | 60/100 [00:05<00:03, 10.77it/s]step i: 5
    7. step i: 6
    8. 80%|████████ | 80/100 [00:07<00:01, 10.29it/s]step i: 7
    9. step i: 8
    10. 100%|██████████| 100/100 [00:09<00:00, 10.09it/s]step i: 9
    11. 100%|██████████| 100/100 [00:10<00:00, 9.91it/s]

    2.4 使用write更新进度信息

    1. from tqdm import trange, tqdm
    2. import time
    3. pbar = trange(10)
    4. for i in pbar:
    5. time.sleep(1)
    6. if not (i % 2):
    7. tqdm.write('finish task %i' % i)

    运行代码显示如下:

    1. 10%|█ | 1/10 [00:01<00:09, 1.01s/it]finish task 0
    2. 30%|███ | 3/10 [00:03<00:07, 1.01s/it]finish task 2
    3. 50%|█████ | 5/10 [00:05<00:05, 1.01s/it]finish task 4
    4. 70%|███████ | 7/10 [00:07<00:03, 1.01s/it]finish task 6
    5. 90%|█████████ | 9/10 [00:09<00:01, 1.01s/it]finish task 8
    6. 100%|██████████| 10/10 [00:10<00:00, 1.01s/it]

    2.5 通过set_descriptionset_postfix设置进度条显示信息

    1. from random import random, randint
    2. from tqdm import trange
    3. import time
    4. with trange(10) as t:
    5. for i in t:
    6. print('step i:', i)
    7. t.set_description("GEN %i" % i) # 进度条左边显示信息
    8. t.set_postfix(loss=random(), gen=randint(1, 999), str="h", lst=[1, 2]) # 进度条右边显示信息
    9. time.sleep(0.1)

    运行代码显示如下:

    1. GEN 0: 0%| | 0/10 [00:00853, loss=0.984, lst=[1, 2], str=h]step i: 0
    2. step i: 1
    3. 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
    4. 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
    5. step i: 4
    6. 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
    7. 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
    8. 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
    9. step i: 8
    10. 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
    11. GEN 9: 100%|██████████| 10/10 [00:01<00:00, 9.13it/s, gen=104, loss=0.578, lst=[1, 2], str=h]

  • 相关阅读:
    什么是RC低通滤波电路
    【C++】实现D3D9 的 Inline hook
    java项目之服装定制系统(ssm框架)
    代码随想录算法训练营第十四天 |二叉树
    【机器学习】机器学习中的人工神经元模型有哪些?
    [HDLBits] Exams/ece241 2013 q12
    STM32WB55开发(4)----配置串口打印Debug调试信息
    Java高级---网络编程
    【SA8295P 源码分析 (三)】121 - MAX9295A 加串器芯片手册分析 及初始化参数分析
    MyBatis-Plus为简化开发而生
  • 原文地址:https://blog.csdn.net/lsb2002/article/details/133754470