一、tqdm简介
tqdm是一个python进度条库,可以在 Python长循环中添加一个进度提示信息。
二、3种使用方法
1.tqdm(range)-自动更新
import time
from tqdm import range
# 自动更新
for i in tqdm(range(10)): # 共可以更新10次进度条
time. Sleep(0.5) # 每次更新间隔0.5s
range(10)意味着这里的进度条可以更新10次,由于这里是自动更新,所以一次循环就会更新进度条1,每次更新间隔0.5s。
2.trange()-自动更新
import time
from tqdm import trange
for i in trange(10):
time.sleep(0.5)
这个的效果和方法1一样。
3.手动控制更新
from tqdm import tqdm
# 用with语句,进度条完成后会自动关闭
with tqdm(total=10) as pbar:
for i in range(10):
time. Sleep(0.5)
pbar.update(1)
# 变量在外部创建,进度结束后手动关闭
phar = tqdm(total=100)
for i in range(100):
time.sleep(0.1)
phar.update(1)
phar.close()
这里的total=10意味着这里的进度条可以更新十次,由于这里是手动更新,需要使用update()方法,update(1)意味着每次更新进度1,每次更新间隔0.5s。
三、应用举例
以方法3在有关代码中的使用为例,其代码可以这样写:
# 开始训练
for epoch in range(num_epochs):
train_l_sum, train_acc_sum, n, start = 0.0, 0.0, 0, time. Time()
with tqdm(total=468, desc="Epoch: %d" % epoch) as pbar:
for idx, (X, y) in enumerate(train_iter, 0):
X = X.to(device)
y = y.to(device)
y_hat = net(X)
l = loss(y_hat, y).sum()
optimizer.zero_grad()
l.backward()
optimizer. Step()
train_l_sum += l.item()
train_acc_sum += (y_hat.argmax(dim=1) == y).float().sum().item()
n += y.shape[0]
pbar.update(1) # 更新一次进度1
test_acc = evaluate_accuracy(test_iter, net)
# 在进度条上显示有关信息
pbar.set_postfix({
'loss': '%.4f' % (train_l_sum / n),
'train acc': '%.3f' % (train_acc_sum / n),
'test acc': '%.3f' % test_acc ,
'time': '%.1f time. Time.time() - start)
})
四、多行更新滚动不一致
原来的代码
from tqdm import tqdm
import time
for i in tqdm(range(10000)):
time.sleep(0.001)
原来的效果
讲解:多行滚动,虽然能记录下每次迭代的信息,但如果这些信息对你来说不重要,这种上下滚动方式比较annoying…
1%|▋ | 95/10000 [00:00<00:10, 945.58it/s
2%|█▎ | 190/10000 [00:00<00:10, 945.08it/
3%|█▊ | 283/10000 [00:00<00:10, 940.11it/
4%|██▍ | 378/10000 [00:00<00:10, 940.84it
优化后版本
from tqdm import tqdm
import time
for i in tqdm(range(10000), ncols=10):
time.sleep(0.001)
完美实现版本
from tqdm import trange
import time
iter = 100
with trange(iter , desc='Progress', unit='step', ncols=120) as pbar:
for n in pbar: # 开始循环
time.sleep(1) # 这里是你的实现代码
# pbar.set_description(f'Step-{simstep}: ') # 这里可以实时更改进度条前面的说明
pbar.set_postfix({
'duration': '%.4fms' % (duration_step * 1000),
'avg': '%.4fms' % ((sum(duration_list) / len(duration_list)) * 1000)
}) # 实时更新进度条后面的说明