目录
1、简介
tqdm是Python中专门用于进度条美化的模块,通过在非while的循环体内嵌入tqdm,可以得到一个能更好展现程序运行过程的提示进度条信息,本文就将针对tqdm的基本用法进行介绍。
2、使用
用法:tqdm(iterator)
#参数介绍
iterable=None,
desc=None, 传入str类型,作为进度条标题(类似于说明)
total=None, 预期的迭代次数
leave=True,
file=None,
ncols=None, 可以自定义进度条的总长度
mininterval=0.1, 最小的更新间隔
maxinterval=10.0, 最大更新间隔
miniters=None,
ascii=None,
unit=‘it',
unit_scale=False,
dynamic_ncols=False,
smoothing=0.3,
bar_format=None,
initial=0,
position=None,
postfix 以字典形式传入 详细信息 例如 速度= 10,
tqdm官方文档: https://github.com/tqdm/tqdm
个人学习代码例子demo: https://github.com/elim28/demos/tree/master/tqdm-demo
2.1安装
pip install tqdm
2.2示例
手动控制tqdm的更新
使用with语句,通过update
方法可以控制每次进度条更新的进度:
from tqdm import tqdm
import time
#total参数设置进度条的总长度
with tqdm(total=100) as pbar:
for i in range(100):
time.sleep(0.05)#为了看进度条中间结果
#每次更新进度条的长度
pbar.update(1)
#update=2
with tqdm(total=100) as pbar:
for i in range(100):
time.sleep(0.05)#为了实时查看进度条中间结果
#每次更新进度条的长度
pbar.update(2)
#只更新部分
with tqdm(total=100) as pbar:
for i in range(10):
time.sleep(0.05)#为了实时查看进度条中间结果
pbar.update(1)
#全部数据遍历=for遍历次数*每次update次数
with tqdm(total=100) as pbar:
for i in range(10):
time.sleep(0.05)
pbar.update(10)
注意:for遍历全部数据(方法1)
结果(中间和最后都是进度条+相关信息)
- 已循环次数/总循环次数
- 进度条每次增加的是设置的update的大小,直至tqdm设定的全部数据total大小
- 已过时间/剩余时间
- 瞬时速度(每秒循环次数)
- 还可以有左边和右边的描述信息
- 下面是中间和最后结果
.
注意:update大于1的话
- 中间是进度条和信息,但是最后只输出最终的平均速度
- 中间的已循环次数+瞬时速度+最后输出的bit全部变成相应倍数
- 下面是等于2的情况
注意:for循环只是遍历部分数据
- 那么进度条也是只遍历部分数据
- 下面试试截取最后部分,未截图中间部分
注意:for循环遍历全部数据
- 可以是for遍历全部数据,update=1,就是第一种
- 可以for遍历次数*update次数只要等于全部数据也可以(本例子是这种)
- 但是速度是第一种的10倍
- 速度与update大小有关
- 下面试试截取最后部分,未截图中间部分
除了使用with
之外,还可以使用另外一种方法实现上面的效果。最后需要手动关闭tqdm
from tqdm import tqdm
import time
#total参数设置进度条的总长度
pbar = tqdm(total=100)
for i in range(100):
time.sleep(0.05)
#每次更新进度条的长度
pbar.update(1)
#关闭占用的资源
pbar.close()
pbar = tqdm(total=100)
for i in range(10):
time.sleep(0.05)
pbar.update(10)
pbar.close()
结果同上
自定义进度条显示信息
通过set_description
和set_postfix
方法设置进度条显示信息:
import tqdm
from random import random, randint
from tqdm import tqdm
import time
#total参数设置进度条的总长度
with tqdm(total=100) as pbar:
for i in range(100):
time.sleep(0.1)
#设置进度条左边显示的信息
pbar.set_description("GEN %i"%i)
#设置进度条右边显示的信息
pbar.set_postfix(loss=random(),gen=randint(1,999),str="h",lst=[1,2])
#每次更新进度条的长度
pbar.update(1)
结果
通过任意的迭代器使用
import tqdm
from random import random, randint
from tqdm import tqdm
import time
from tqdm import trange
pbar = tqdm(["a", "b", "c", "d"]) #定义外部循环来控制tqdm
for char in pbar:
time.sleep(0.1)
# 设置描述
pbar.set_description("Processing %s" % char)
alist = list('letters')
bar = tqdm(alist)#定义外部循环来控制tqdm
for letter in bar:
time.sleep(0.1)
bar.set_description(f"Now get {letter}")
for i in tqdm(range(1000)):#默认更新10
time.sleep(0.01)#进度条每0.1s前进一次,总时间为1000*0.1=100s
for i in trange(4, desc='1st loop'):#当前指示
for j in trange(100, desc='2st loop'):#进度条嵌套使用:已完成+当前正在进行
time.sleep(0.1)
前面3个普通输出
最后一个嵌套的结果
- 一个个的进行
- 前3行是已完成
- 第四行是当前指示
- 最后一行是当前进行
最后结果
通过trange()方法使用
trange(i)
是 tqdm(range(i))
的简单写法
from tqdm import trange
for i in trange(100):
#do something
sleep(0.01)
tqdm 的 标准打印输出write 方法
在使用tqdm显示进度条的时候,若代码中存在print可能会使得输出杂乱,此时可以将print语句替换为tqdm.write,代码如下:
import time
from tqdm import *
bar = trange(10)
for i in bar:
time.sleep(0.1)
if not (i % 3):
tqdm.write("Done task %i" % i)
结合pandas的使用
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0, 100, (10000000, 6)))
tqdm.pandas(desc="my bar!")
df.progress_apply(lambda x: x**2)
结合jupyter notebook
tqdm针对jupyter notebook添加了专门的进度条美化方法,使用tqdm_notebook()方法,下面是一个简单的例子:
vscode如何打开jupyter(可以参考):
- 查看-打开视图-输入>ju
- 或者直接新建文件,后缀为ipynb
from tqdm import tqdm_notebook
import time
for i in tqdm_notebook(range(100),desc='demo:'):
time.sleep(0.01)