1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        給 Python 添加進(jìn)度條 | 給小白的 tqdm 精煉實(shí)例!

        共 3495字,需瀏覽 7分鐘

         ·

        2021-09-11 01:21

        假設(shè)我們有一個(gè)循環(huán):

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

        假設(shè) do_something() 很慢,且運(yùn)行時(shí)間不穩(wěn)定,當(dāng)我們運(yùn)行時(shí),我們并不知道運(yùn)行到哪里了。

        我們引入一個(gè)進(jìn)度條。

        from tqdm import trange
        for i in trange(100):
            do_something()

        輸出
          5%|██▌                                                 | 5/100 [00:05<01:35,  1.01s/it]

        如上,我們就可用實(shí)時(shí)查看進(jìn)度。

        安裝

        這個(gè)庫并不是 python 自帶的庫,使用 pip 安裝就可。

        pip install tqdm

        來看看我的實(shí)驗(yàn)環(huán)境。

        ? python --version
        Python 3.7.0

        >>> tqdm.__version__
        '4.59.0'

        入門實(shí)例

        說實(shí)在的,官方文檔[1]寫得并不是很好。

        對于 range() ,我們把其改為 tqdm 中的 trange() 就可以。

        其實(shí), trange(5) 相當(dāng)于 tqdm(range(5)) 。

        所以不難看出,用 tqdm 包裹 tqdm(可迭代的對象) 就可以自動為我們建立進(jìn)度條。

        >>> 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 邏輯上沒有區(qū)別,但是前者讓控制臺多出了一個(gè)進(jìn)度條。

        自定義進(jìn)度條

        其實(shí),我們還可用「手把手地」操作進(jìn)度條。尤其是當(dāng)我們的進(jìn)度并不是單純的依靠可迭代變量時(shí)。

        假設(shè)我們有個(gè)任務(wù)如下。

        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(150)
                self.jobs = max(0, self.jobs - job_minus)
                return job_minus

        我們總共有 1e3 = 1000 個(gè)任務(wù)要做,但是這些任務(wù)并不是每次做一個(gè),而是每次可能做 [1, 50) 個(gè)中的任意數(shù)量的工作。

        所以我們不可以單純讓 do_job 運(yùn)行 1000 次,因?yàn)槊看?do_job 的效率不同。

        這時(shí)我們定制我們的進(jìn)度條。

        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)

        如上,我們聲明了一個(gè) tqdm 對象:

        • 這個(gè)對象的計(jì)數(shù)總量是我們的總工作量 total=task.jobs
        • 進(jìn)度條的前綴是 'Doing jobs'
        • 每一次刷新進(jìn)度,我們進(jìn)度條的增量是 t.update(job_minus)
        • 我們進(jìn)度條后綴輸出信息 info['efficiency'] = job_minus

        來看看效果。

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

        動圖如下。

        總結(jié)

        通過實(shí)例探討了 tqdm 進(jìn)度條的使用。

        參考資料

        [1]

        官方文檔: https://tqdm.github.io/docs/tqdm/

        瀏覽 35
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            国产外围女 | 精品七区| 网友自拍网站 | 豆花影院在线观看完整版 | 最好看2019中文在线播放电影 | 亚洲精品无码视频 | 五月天激情国产 | 北条麻妃无码在线播放 | 真人乱爱视频免费看 | 高潮大合集爽到抽搐 |