一个进度条还能玩这么花?

如果你写的代码里有一些很耗时的操作,你会怎么处理?

比如像这样一个 1 万乘 1 万的两层循环:

X = 10000
for i in range(X):
    for j in range(X):
        k = j * i
print('\n完成!')

如果就这么直接运行,那么很可能让你陷入未知的等待。你不知道程序执行到哪儿了,还要执行多久,以及是不是还在正常运行……

这时候:

白银选手知道在循环里加上 print,但直接输出会让你的控制台瞬间爆炸。

X = 10000
for i in range(X):
    for j in range(X):
        k = j * i
    print(i)
print('\n完成!')

黄金选手会用 '\r' 字符让输出保持在同一行。

X = 10000
for i in range(X):
    for j in range(X):
        k = j * i
    print(f'{i+1} / {X}', end='\r')
print('\n完成!')

钻石选手甚至给你手搓一个进度条出来。

X = 10000
for i in range(X):
    for j in range(X):
        k = j * i
    print('进度',
          f'|{"█"*((i+1)*50//X):50}|'
          f'{(i+1)*100//X}%'
          end='\r')
print('\n完成!')

但真正的王者……则会直接用现成的库。

progress

progress 模块提供了多种进度条样式供你选择。

同时你也可以通过参数修改进度条的填充字符和描述文本。

tqdm

更加为人所熟知的进度条模块是 tqdm(天桥大妈?)。这个词据说是阿拉伯语“进度”的意思,也是西班牙语“我好爱你”的缩写(作者挺浪漫啊)。

tqdm 的使用更简单,只要给循环的迭代对象加上tqdm就行了。

或者直接用模块中的 trange 替代原本的 range 方法。都不用你在循环中增加代码。

from tqdm import tqdm, trange

X = 10000
for i in tqdm(range(X)):
# for i in trange(X):
    for j in range(X):
        k = j * i
print('完成!')

tqdm 没搞太多花哨的样式,但对各种开发环境的支持很好,比如改成  tqdm.rich,就可以在控制台下得到一个彩色的进度条。

改成 tqdm.notebook,可以优化在 jupyter notebook 中的显示。

加上 tk,则是一个基于 tkinter 的进度条弹窗。

那有人要说了,“我想要的进度条不一定都是用在循环代码上呀”。那也简单,直接定义一个 tqdm 对象,然后在代码中手动更新进度。

from tqdm import tqdm
from time import sleep
bar = tqdm(total=100)
bar.set_description('采集数据')
sleep(0.5)
bar.update(10)
bar.set_description('分析数据')
sleep(0.5)
bar.update(89)
bar.set_description('展示数据')
sleep(5)
bar.update(1)
bar.close()
print('完成!')

你现在知道,为什么很多软件都会卡在 99% 的地方了吧?

Alive Progress

如果你觉得这个进度条不够彰显你代码的独特气质,那么还可以看看 Alive Progress 这个模块。

它的写法和前面的 progress 很像,看上去平平无奇:

from alive_progress import alive_bar

X = 10000
with alive_bar(X) as bar:
    for i in range(X):
        for j in range(X):
            k = j * i
        bar()
print('完成!')

但它的动态效果一定会让你惊艳!

好了,以上就是 Python 中几种常见的进度条写法,你喜欢哪一种呢?

·················END·················

推荐阅读

•   七年青春喂了狗•   阿里的开源,这两天被喷惨了•   Sora的第一波受害者出现了

相关推荐

  • 刚刚,北京最火独角兽又融资了
  • 知识图谱最大的敌人,是自己
  • 流图计算在蚂蚁数仓加速场景的应用
  • 如何克服 LLM 的工程挑战?GTC 2024 带来新惊喜!
  • 一文了解傅立叶变换在机器学习的应用
  • 1.5k star,这款低代码平台完全开源,诚意满满!
  • 速来!体验阿里通义灵码,抽AI盲盒赢大奖,100%中奖,永不落空~
  • 大模型的DenseNet时刻!华为诺亚新作让Mamba和RetNet精度显著提升
  • 全面解析LoRA、QLoRA、RLHF,PPO,DPO,Flash Attention、增量学习等大模型算法
  • iOS程序员失业,老婆威胁要堕胎,怎么办?
  • Firestore 多数据库普遍可用:一个项目,多个数据库,轻松管理数据和微服务
  • 中国工商银行软件开发中心自建广告智能投放平台的技术思考
  • 智谱、月之暗面、阿里、字节、vivo、达观数据等专家深入剖析 RAG 技术及其应用,AICon 邀你共鉴前沿
  • QCon 大会偶遇大佬,聊聊 ZingJDK 和 JVM
  • “微软已经沦落为 OpenAI 的一个 IT 部门”!资源倾斜引发微软内部员工不满、高管离职
  • Java程序员必备咖啡杯
  • 程序员逆袭CEO总共分几步?
  • 微信全新Linux版本开放下载——基于原生跨平台方案重构
  • 没事别想不开去创业!
  • 大学教师磨洋工的十大惯用招数