zoukankan      html  css  js  c++  java
  • 给 Python 添加进度条 | 给小白的 tqdm 精炼实例!

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

    图源: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 。

  • 相关阅读:
    前序中序输出后序
    Blah数集
    中缀表达式转后缀表达式 (栈)
    1357:车厢调度 (栈)
    最长公共上升子序列 (LIS+LCS+记录)
    1481:Maximum sum (前缀和+dp)
    8464:股票买卖
    7627:鸡蛋的硬度
    2989:糖果
    U33405 纽约 (二分)
  • 原文地址:https://www.cnblogs.com/piperliu/p/14882223.html
Copyright © 2011-2022 走看看