Python中tqdm的使用和例子
作者:Le0v1n 发布时间:2022-05-31 23:59:32
1. tqdm的介绍
有时候在使用Python处理比较耗时操作的时候,为了便于观察处理进度,这时候就需要通过进度条将处理情况进行可视化展示,以便我们能够及时了解情况。
tqdm就能非常完美的支持和解决这些问题,可以实时输出处理进度而且占用的CPU资源非常少,支持windows、Linux、mac等系统,支持①循环处理、②多进程、③递归处理、还可以结合Linux的命令来查看处理情况,等进度展示。
1.1 tqdm导入
# 方法1
import tqdm
# 方法2
from tqdm import tqdm
建议使用方法1,因为方法1导入的是一个lib,而方法2导入的是
tqdm.tqdm
方法
使用方法2导入就没办法使用tqdm.trange()
等方法了
2. tqdm.tqdm()对可迭代对象进行封装
2.1 语法
# 方法1
for i in tqdm.tqdm(可迭代对象):
pass
# 方法2
for idx, i in enumerate(tqdm.tqdm(可迭代对象)):
pass
对于可以迭代的对象都可以使用tqdm进行封装实现可视化进度,使用起来非常方便。
2.2 例子
import tqdm
import time
# 定义一个可迭代对象
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 正常的遍历(没有进度条)
for idx, element in enumerate(a):
print(f"No.{idx}: {element}")
# 使用tqdm对可迭代对象进行包装,实现进度条可视化
for idx, element in enumerate(tqdm.tqdm(a)):
time.sleep(0.5)
print(f"No.{idx}: {element}")
结果如下:
Q:为什么结果会一直新建一行?
A:这是因为每次的print内容都不一样,为了能够显示新的内容,所以会这样。
我们看下面这个程序,它因为没有控制台输出,所以进度条就很正常。
2.3 带有参数的tqdm.tqdm()
Q:进度条可以加一些其他信息吗?
A:当然可以,需要对tqdm进行一些参数调整
@staticmethod
def format_meter(n, total, elapsed, ncols=None, prefix='', ascii=False, unit='it',
unit_scale=False, rate=None, bar_format=None, postfix=None,
unit_divisor=1000, initial=0, colour=None, **extra_kwargs):
iterable: 可迭代的对象, 在?动更新时不需要进?设置
desc: 字符串, 左边进度条描述?字
total: 总的项?数
leave: bool值, 迭代完成后是否保留进度条
file: 输出指向位置, 默认是终端, ?般不需要设置
ncols: 调整进度条宽度, 默认是根据环境?动调节长度, 如果设置为0, 就没有进度条, 只有输出的信息
unit: 描述处理项?的?字, 默认是it, 例如: 100 it/s, 处理照?的话设置为img ,则为 100 img/s
unit_scale: ?动根据国际标准进?项?处理速度单位的换算, 例如 100000 it/s >> 100k it/s
colour: 进度条颜色
2.3.1 例子1
import tqdm
import time
d = {'loss':0.2,'learn':0.8}
"""
desc设置名称
ncols设置进度条长度 -> 建议设置在100以内
postfix以字典形式传入详细信息
"""
for i in tqdm.tqdm(range(50),desc='名称',ncols=100,postfix=d):
time.sleep(0.1)
pass
其中
xxxit/s
表示每秒迭代的次数
2.3.2 例子2
import tqdm
import time
iter_object = range(10, 21)
pbar = tqdm.tqdm(iter_object,
total=len(iter_object),
leave=True,
ncols=100,
unit="个",
unit_scale=False,
colour="red")
for idx, element in enumerate(pbar):
time.sleep(0.5)
pbar.set_description(f"No.{idx}")
pbar.set_postfix({"正在处理的元素为": element})
3. 自定义进度条显示信息
Q:我就是想print一些东西,可以吗?
A:当然可以,tqdm提供了两个个方法:
set_description()
???????set_postfix()
这两个方法就类似于print,可以在进度条中显示一些变动的信息
3.1 例子1
import tqdm
import time
# 在使用set_description时一般会创建一个tqdm.tqdm()对象
pbar = tqdm.tqdm(["a", "b", "c", "d", "e", "f", "g"])
for idx, element in enumerate(pbar):
time.sleep(1)
pbar.set_description(f"No.{idx}: {element}")
3.2 例子2
import tqdm
import time
import random
epochs = 150
# 在使用set_description()和set_postfix()时一般会创建一个tqdm.tqdm()对象
pbar = tqdm.tqdm(range(epochs), ncols=100) # ncols设置进度条显示的字符长度,小了就显示不全了
for idx, element in enumerate(pbar):
time.sleep(0.01)
pbar.set_description(f"Epoch {idx}/{epochs}")
pbar.set_postfix({"class": element}, loss=random.random(), cost_time = random.randrange(0, 100))
3.3 两种方法传参注意事项
set_description
和set_postfix
都用的kwargs传参,所以我们可以:
用字典传参 -> pbar.set_postfix({"key_1": "value_1", ...})
直接用关键字传参 -> pbar.set_postfix(key_1 = value_1, key_2 = value_2, ...)
混着用 -> pbar.set_postfix({"key_1": value_1, "key_2": value_2, ...}, key_3 = value_3, ...)
4. tqdm内置生成可迭代对象方法 —— trange()
除了tqdm.tqdm(range(xxx))
这样的写法外,tqdm也提供了类似的方法,即tqdm.trange(xxx)
,例子如下:
import tqdm
import time
pbar = tqdm.trange(300, 400, 1)
for idx, element in enumerate(pbar):
time.sleep(0.01)
pbar.set_description(f"No.{idx} -> {element}")
5. 自定义方法更新进度
有时候我们不仅仅是通过一个for训练来更新进度条,我们也希望在做完某些操作后更新一次进度条,代码如下:
import tqdm
import time
with tqdm.tqdm(total=10) as bar: # total为进度条总的迭代次数
# 操作1
time.sleep(1)
# 更新进度条
bar.update(1) # bar.update()里面的数表示更新的次数,和optimizer.step方法类似
# 操作2
time.sleep(2)
# 更新进度条
bar.update(3)
# 操作3
time.sleep(1)
# 更新进度条
bar.update(6) # 建议不要超过total
参考
https://www.jb51.net/article/218860.htm
https://www.jb51.net/article/166648.htm
https://blog.csdn.net/qq_41554005/article/details/117297861
来源:https://blog.csdn.net/weixin_44878336/article/details/124894210


猜你喜欢
- 图像增强算子几何变换算子图像的几何变换又称为图像空间变换, 它将一幅图像中的坐标位置映射到另一幅图像中的新坐标位置。图像缩放缩放只是调整图像
- 本文实例讲述了Python模块的定义,模块的导入,__name__用法。分享给大家供大家参考,具体如下:相关内容:什么是模块模块的导入同级目
- 问题有一个元素序列,想知道在序列中出现次数最多的元素是什么解决方案collections 模块中的 Counter 类转让给女士为此问题所设
- 无参修饰 ,无参数时不需要调用def log1(func): func()@log1def test(): prin
- 一、前言分布式环境下数据库的读写分离策略是解决数据库读写性能瓶颈的一个关键解决方案,更是最大限度了提高了应用中读取 (Read)
- 题目描述原题链接 :66. 加一给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组
- 新手刚开始使用vue时,常会遇见一个坑,那就是热替换失效。什么?你跟我说使用官方的vue-cli去构建,我就是使用vue-cli后突然失效。
- 本章的内容完全基于上文的理论基础,实际上一旦理解了索引背后的机制,那么选择高性能的策略就变成了纯粹的推理,并且可以理解这些策略背后的逻辑。示
- Redis通常被认为是一种持久化的存储器关键字-值型存储,可以用于几台机子之间的数据共享平台。连接数据库 注意:假设现有几台在同一局域网内的
- 实例1:获取星期字符串程序读入一个表示星期几的数字(1~7),输出对应的星期字符串名称。例如,输入 3,返回“星期三&a
- Python内建了map()和reduce()函数。如果你读过Google的那篇大名鼎鼎的论文“MapReduce: Simplified
- 看下面的例子就明白了class Test(object): def __init__(self, value='hell
- SQL Server的作业调度来建立自动备份的方法◆1、进入企业管理器中->管理->sql server代理->作业;◆2
- 本文给大家介绍有关数据库SQL递归查询在不同数据库中的实现方法,具体内容请看下文。比如表结构数据如下:Table:TreeID Name P
- 什么是条形图?条形图(bar chart)是用宽度相同的条形的高度或长短来表示数据多少的图形。条形图可以横置或纵置,纵置时也称为柱形图(co
- XML是一个精简的SGML,它将SGML的丰富功能与HTML的易用性结合到Web的应用中。XML保留了SGML的可扩展功能,这使XML从根本
- 一般情况下,tensorflow里面变量初始化过程为: #variables ........... #......
- strstr 定义和用法注释:该函数是二进制安全的。语法strstr(string,search,before_search)参数
- django 模版显示的html中出现'类似的ascii字符,这是由于django对单引号进行了转义,可以通过关闭转 * 决h
- 前言图像分割是许多计算机视觉应用中的关键处理步骤,通常用于将图像划分为不同的区域,这些区域常常对应于真实世界的对象。因此,图像分割是图像识别