给 Python 添加进度条 | 给小白的 tqdm 精炼实例!

假设我们有一个循环:

for i in range(100):
do_something() # 这里做某些事

假设 do_something() 很慢,且运行时间不稳定,当我们运行时,我们并不知道运行到哪里了。

我们引入一个进度条。

from tqdm import trange
for i in trange(100):
do_something() 输出
5%|██▌ | 5/100 [00:05<01:35, 1.01s/it]

如上,我们就可用实时查看进度。

安装

这个库并不是 python 自带的库,使用 pip 安装就可。

pip install tqdm

来看看我的实验环境。

❯ python --version
Python 3.7.0 >>> tqdm.__version__
'4.59.0'

入门实例

说实在的,官方文档写得并不是很好。

对于 range() ,我们把其改为 tqdm 中的 trange() 就可以。

其实, trange(5) 相当于 tqdm(range(5))

所以不难看出,用 tqdm 包裹 tqdm(可迭代的对象) 就可以自动为我们建立进度条。

>>> a = ['a', 'b', 'c'] * 10000
>>> from tqdm import tqdm
>>> for i in tqdm(a):
... pass
...
100%|███████████| 30000/30000 [00:00<?, ?it/s]
>>>

使用 for i in tqdm(a)for i in a 逻辑上没有区别,但是前者让控制台多出了一个进度条。

自定义进度条

其实,我们还可用「手把手地」操作进度条。尤其是当我们的进度并不是单纯的依靠可迭代变量时。

假设我们有个任务如下。

import random
import time class Task:
def __init__(self) -> None:
self.jobs = int(1e3) @property
def job_done(self) -> bool:
return self.jobs <= 0 def do_job(self) -> int:
time.sleep(1)
job_minus = random.randint(1, 50)
self.jobs = max(0, self.jobs - job_minus)
return job_minus

我们总共有 1e3 = 1000 个任务要做,但是这些任务并不是每次做一个,而是每次可能做 [1, 50) 个中的任意数量的工作。

所以我们不可以单纯让 do_job 运行 1000 次,因为每次 do_job 的效率不同。

这时我们定制我们的进度条。

from tqdm import tqdm

task: Task = Task()

info = { 'efficiency': None }

with tqdm(
total=task.jobs, desc='Doing jobs'
) as t: while not task.job_done: job_minus = task.do_job() info['efficiency'] = job_minus
t.update(job_minus)
t.set_postfix(info)

如上,我们声明了一个 tqdm 对象:

  • 这个对象的计数总量是我们的总工作量 total=task.jobs
  • 进度条的前缀是 'Doing jobs'
  • 每一次刷新进度,我们进度条的增量是 t.update(job_minus)
  • 我们进度条后缀输出信息 info['efficiency'] = job_minus

来看看效果。

❯ python .\example.py
Doing jobs: 9%|██▏ | 94/1000 [00:03<00:28, 31.73it/s, efficiency=30]

动图如下。

总结

通过实例探讨了 tqdm 进度条的使用。

我是小拍,老铁们记得点赞关注!微信 PiperLHJ 。

给 Python 添加进度条 | 给小白的 tqdm 精炼实例!的更多相关文章

  1. python 添加进度条

    安装: pip install tqdm使用: from tqdm import tqdm import time for i in tqdm(rang(10)): time.sleep(0.1)

  2. Python之进度条及π的计算

    Python之进度条及π的计算 文本进度条 1.  简单的开始 这是利用print()函数来实现简单的非刷新文本进度条.它的基本思想是按照任务执行百分比将整个任务划分为100个单位,每执行N%输出一次 ...

  3. Python实现进度条和时间预估的示例代码

    一.前言 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我给大家 ...

  4. Python字符进度条

    Python字符进度条 看看这个神奇的module from tqdm import trange from time import sleep for r in trange(10, 1, -1): ...

  5. QTableView 添加进度条

    记录一下QTableView添加进度条 例子很小,仅供学习 使用QItemDelegate做的实现 有自动更新进度 要在.pro文件里添加 CONFIG += c++ ProgressBarDeleg ...

  6. struts2上传文件添加进度条

    给文件上传添加进度条,整了两天终于成功了. 想要添加一个上传的进度条,通过分析,应该是需要不断的去访问服务器,询问上传文件的大小.通过已上传文件的大小, 和上传文件的总长度来评估上传的进度. 实现监听 ...

  7. Python实现进度条功能

    Python实现进度条功能 import sys, time def progress(percent, width=50): # 设置进度条的宽度 if percent >= 100: # 当 ...

  8. EasyUI添加进度条

    EasyUI添加进度条 添加进度条重点只有一个,如何合理安排进度刷新与异步调用逻辑,假如我们在javascript代码中通过ajax或者第三方框架dwr等对远程服务进行异步调用,实现进度条就需要做到以 ...

  9. c#devexpress GridContorl添加进度条

    demo 的实现图 下边是步骤和代码 1定义 时钟事件,定时的增加进度条的增量. 2:  添加进度条 3;定义字段属性 using System; using System.Collections.G ...

  10. iOS WKWebView添加进度条02

    之前写了一个是关于webview添加进度条的,现在补一个WKWebView进度条. //添加一个全局属性 @property(nonatomic,strong)CALayer *progresslay ...

随机推荐

  1. 容器部署DNS你会吗?

    docker快速部署DNS,实现快速上线 概念 环境介绍 部署DNS 下载相关镜像 创建并启动DNS容器 简单介绍三种创建方式 容器启动停止 创建dns交互式容器 配置DNS容器相关配置 测试 修改客 ...

  2. 在嵌入式设备中实现webrtc的第三种方式②

    先贴上效果图以及操作路径. 操作路径为:启动信令服务器,配置浏览器关闭mDNS,双端登录,浏览器端邀请.最终连接成功建立,我们通过datachannel成功通信 (关闭mDNS是因为谷歌浏览器隐藏了局 ...

  3. kubectl常用命令(二)

    四.进入容器 # 进入pod容器,但是对权限要求也较多 kubectl exec -it podName sh # 通过bash获得 pod 中某个容器的TTY,相当于登录容器 kubectl exe ...

  4. NOIP2024模拟赛13:拆开未来

    NOIP2024模拟赛13:拆开未来 写在前面:进制哈希的P不要用998244353会被卡!用131.注意取模为负数的情况! C-重复 一句话题意:给定字符串 \(S\), 问 \(S\) 的所有子串 ...

  5. Xor-FWT 的另一种理解方式

    Xor-FWT 的另一种理解方式 学习 \(\text{Fennec's Algorithm}\) 的额外收获,顺手记录一下. 假设我们要求两个长度为 \(n\) 的数组的异或卷积,为方便起见令 \( ...

  6. ARC121D 1 or 2

    ARC121D 1 or 2 诈骗题. 思路 吃一个糖的操作可以看做是和一个 \(a_i\) 为 0 的糖一起吃. 可以枚举有多少个糖单独吃来确定要增加多少个 0. 问题变为每次吃两颗糖. 根据人类直 ...

  7. 2023NOIP A层联测26 T4 abstract

    2023NOIP A层联测26 T4 abstract 乱证明求性质的光速幂优化题. 思路 对于每一个节点,到该节点的子树内的叶子节点的路径中(包括路径上的点),出现的值只有 \(k\times(\l ...

  8. VL4AD:让语义分割认识未知类别,无需额外数据和训练的OOD语义分割 | ECCV'24

    来源:晓飞的算法工程笔记 公众号,转载请注明出处 论文: VL4AD: Vision-Language Models Improve Pixel-wise Anomaly Detection 论文地址 ...

  9. bootstrap table 搜索只从当前页开始搜

    项目中出现的情况,使用bootstrap table框架,使用搜索功能的是后查询的结果不是从第一也开始,有时候点击搜索第一次查不出来结果,点击第二次结果才出现. 解决方法: $("#btn_ ...

  10. JVM的参数说明

    Java虚拟机的参数说明 Java运行时数据区域: 线程共享区:方法区(永久区),堆 线程私有区:虚拟机栈,本地方法栈,程序计数器 JAVA_OPTS="-server -Duser.tim ...