<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          給 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è)庫(kù)并不是 python 自帶的庫(kù),使用 pip 安裝就可。

          pip install tqdm

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

          ? python --version
          Python 3.7.0

          >>> tqdm.__version__
          '4.59.0'

          入門(mén)實(shí)例

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

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

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

          所以不難看出,用 tqdm 包裹 tqdm(可迭代的對(duì)象) 就可以自動(dòng)為我們建立進(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 邏輯上沒(méi)有區(qū)別,但是前者讓控制臺(tái)多出了一個(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 對(duì)象:

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

          來(lái)看看效果。

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

          動(dòng)圖如下。

          總結(jié)

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

          參考資料

          [1]

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

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

          手機(jī)掃一掃分享

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

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美精品免费在线观看 | 黄片黄片黄片黄片黄片黄片黄片 | 射操操操逼逼逼 | 色老板美国在线视频网页 | 国产欧美操逼 |