给 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. Top100(中)

    Top100(中) 二叉树 94. 二叉树的中序遍历 int *res; void inorder(struct TreeNode *root, int *returnSize) { if (root ...

  2. Python面相对象的编程

    文章目录 1.基本概念 2.常用方法及代码实现 1.基本概念 Python的面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它使用"对象&q ...

  3. jeecg平台相关01-vue2迁移到vue3

    01-vue2迁移到vue3 嵌套: datasource: master: url: jdbc:mysql://127.0.0.1:3306/jeecg-boot-vue3?characterEnc ...

  4. Next.js 实战开发入门 1 开发环境部署 - 曲速引擎 Warp Drive

    开发目标 我们将构建一个简化版本的财务仪表板,其内容包括:公共主页.登录页面.受身份验证保护的仪表板页面.用户可以添加.编辑和删除发票 开发环境配置 开发客户端 Windows 10 (不限系统,兼容 ...

  5. Go语言单元测试的执行

    Go 语言推荐测试文件和源代码文件放在同一目录下,测试文件以 _test.go 结尾.比如,当前 package 有 calc.go 一个文件,我们想测试 calc.go 中的 Add 和 Mul 函 ...

  6. DCDC电路设计之FB引脚布线

    该随笔从与非网上搬运,原文: 案例讲解,DCDC电源反馈路径的布线规则 下面为正文内容: 在本文中,将对用来将输出信号反馈给电源ic的FB引脚的布线进行说明. 反馈路径的布线 反馈信号的布线在信号布线 ...

  7. Python移除重复元素

    第一种写法:通过set特性去重,但是不保证顺序,无序的 a = ["1", 1, "1", 2] a = list(set(a)) print(a) 结果: [ ...

  8. 使用Ollama和Open WebUI管理本地开源大模型

    Open WebUI和Ollama介绍 Open WebUI 是一个功能丰富且用户友好的自托管 Web 用户界面(WebUI),它被设计用于与大型语言模型(LLMs)进行交互,特别是那些由 Ollam ...

  9. Java并发显式锁和显式条件队列

    一 显式锁 在类中利用synchronized修饰的方法或者this代码块,均使用的是类的实例锁或者类的锁.这些锁都称为内置锁. 可以利用显式锁进行协调对象的访问.即ReentrantLock.这是一 ...

  10. Python之时间日期操作

    常用时间操作的函数汇总, 涵盖 常用的time   datetime 1.计算两个日期相差天数 import datetime str1 = '2021-10-20' str2 = '2021-10- ...