python输出结果刷新及进度条的实现

print函数

python输出主要使用print函数,print函数介绍:

    print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)

 
 
  1. *objects表示要打印的值,表示多个无名参数或需要打印的值;
  2. sep=’ ',对应上面要打印的值中间间隔,默认一个空格;
  3. end=’\n’,传入值打印完后的结束符号,默认为换行符,可以自行设置;
  4. file=sys.stdout,设置打印输出参数,默认打印到终端,也可设置打印保存到文件;
  5. flush=False,是否刷新打印结果。

一行输出结果并刷新

在一行中显示输出结果,每次刷新,其中’\r’表示回到当前的开头,end=’'表示结束符为空,这样就可以每次更新结果

import time
for i in range(15):
    time.sleep(0.5) # 这里为了查看输出变化,实际使用不需要sleep
    print('\r', i, end='', flush=True)
    # print('\r', 15-i, end='') # 从两位变一位会有问题 

 
 

上面代码有个问题,当输出i从大到小,有位数变化时,结果不正确,可用format格式化输出,可解决问题:

import time
for i in range(15):
    time.sleep(0.5)
    print('\r', "{:d}".format(15-i), end='', flush=True)

 
 

模型训练中loss和acc的刷新输出

我们在训练机器学习和深度学习模型中,总会隔一段时间输出损失函数和准确率,每次都直接print输出,终端会输出很多信息,这里用单行输出并刷新的方法来输出这些信息,我们设置epochs和batch的数量,每次batch输出刷新,一个epoch完后同时输出train和test的结果。

import time

# 设置epochs和batch的数量
epochs = 5
n_batch = 15
# 这里是测试自己设置的loss和acc
train_loss = 1.2345
train_acc = 0.345678
test_loss = 1.1234
test_acc = 0.235467

for i in range(epochs):
for j in range(n_batch):
time.sleep(0.5)
train_loss -= 0.001
train_acc += 0.0001

    <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"\rEpoch: {:d} batch: {:d} loss: {:.4f} acc: {:.4f} | {:.2%}"</span>
          <span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>i<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">,</span> j<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">,</span> train_loss<span class="token punctuation">,</span> train_acc<span class="token punctuation">,</span> <span class="token punctuation">(</span>j<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token operator">*</span><span class="token number">1.0</span><span class="token operator">/</span>n_batch<span class="token punctuation">)</span><span class="token punctuation">,</span> end<span class="token operator">=</span><span class="token string">''</span><span class="token punctuation">,</span>  flush<span class="token operator">=</span><span class="token boolean">True</span><span class="token punctuation">)</span>
          
test_loss <span class="token operator">-=</span> <span class="token number">0.001</span>
test_acc <span class="token operator">+=</span> <span class="token number">0.0001</span>

<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"\rEpoch: {:d}/{:d} train_loss: {:.4f} test_loss: {:.4f} train_acc: {:.4f} test_acc: {:.4f}"</span>
	<span class="token punctuation">.</span><span class="token builtin">format</span><span class="token punctuation">(</span>i<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> train_loss<span class="token punctuation">,</span> test_loss<span class="token punctuation">,</span> train_acc<span class="token punctuation">,</span> test_acc<span class="token punctuation">)</span><span class="token punctuation">,</span> end<span class="token operator">=</span><span class="token string">'\n'</span><span class="token punctuation">)</span>

这里注意,print里"Epoch"前面有一个"\r",这个必须要有,同时里面循环end=’’,外面循环end=’\n’,最终打印结果如下:
在这里插入图片描述

tqdm显示进度条

首先安装tqdm:pip install tqdm
简单使用,读取整数,直接在tqdm中传入一个list, 如果直接给定的是一个整数,可以直接用trange

import time
from tqdm import tqdm, trange

for i in tqdm(range(100)):
time.sleep(0.05)
# do something

# for i in trange(100):
# time.sleep(0.05)
# # do something

显示结果如下,显示有百分比,以及当前处理到多少个
在这里插入图片描述
tdqm输入的list可以是字符串,也可以对输出进度条加一些描述

import time
from tqdm import tqdm
pbar = tqdm(["a", "b", "c", "d", "e"])
for char in pbar:
    time.sleep(0.8)
    pbar.set_description("Processing %s" % char)
    # pbar.set_description("Processing {0}".format(char))

 
 

在这里插入图片描述
本文参考:
[1]. https://blog.51cto.com/steed/2049224
[2]. https://blog.csdn.net/phantom_dapeng/article/details/77758271

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值