Python tqdm模塊,如何創建終端進度條

每當我們安裝任何 Python 庫、模塊或安裝軟體時,我們都會看到進度條顯示在屏幕上,進度條表示估計完成或渲染過程需要多長時間的小進度條。它給我們一種活躍的印象,可以鎮定神經。我們都熟悉各種進度條。有些很吸引人,有些很無聊。

在本文中,我們將創建進度條,而不涉及 Python 的代碼核心日誌庫。

進度條根據完成任務的進度百分比來填充。進度可以通過將已處理的項目數量除以總輸入項目來計算。各種因素會影響進度條,例如網路速度、延遲,以及是否將數據保存到本地存儲以獲得更準確的預計到達時間。

我們可以使用名為 tqdm 的 Python 外部庫創建簡單且沒有麻煩的進度條。我們可以把它添加到代碼中,讓它看起來很可愛。

tqdm 在阿拉伯語中代表 taqadum,意思是進步。Python tqdm模塊在 Linux、Window、Mac 等各種平台上工作。並且還兼容 IPython/ Jupyter 筆記本。

進度條的需求

如果我們使用的是較小的數據集,那麼在我們的工作流程中就不會有進展。但是,進度條可用於迭代數據集、訓練模型或編碼大型信息集。

  • 進度條為我們提供了一個進程的估計,並給出了可能需要更多時間的近似值。
  • 它給我們的信息是進度還在運行,沒有被粗暴地終止。

先決條件

Python 3 必須安裝在系統中,我們也可以創建一個虛擬環境來安裝 tqdm 庫。

裝置

打開命令行終端並鍵入以下內容。


pip install tqdm

或者


pip3 install tqdm

上述命令將在系統中成功安裝。我們可以使用下面的語句來驗證它。


import tqdm

如果沒有錯誤,則表示此庫已成功安裝。

為循環添加進度條

程序


import time
import sys
from tqdm import trange

def do_something():
    time.sleep(1)

def do_another_something():
    time.sleep(1)

for i in trange(10, file=sys.stdout, desc='outer loop'):
    do_something()

    for j in trange(100,file=sys.stdout, leave=False, unit_scale=True, desc='inner loop'):
        do_another_something()

輸出:

outer loop:   0%|          | 0/10 [00:00<?, ?it/s]
inner loop:   0%|          | 0.00/100 [00:00<?, ?it/s]
inner loop:   1%|          | 1.00/100 [00:01<01:40, 1.02s/it]
inner loop:   2%|▏         | 2.00/100 [00:02<01:39, 1.02s/it]
inner loop:   3%|▎         | 3.00/100 [00:03<01:38, 1.01s/it]
inner loop:   4%|▍         | 4.00/100 [00:04<01:37, 1.01s/it]
inner loop:   5%|▌         | 5.00/100 [00:05<01:35, 1.01s/it]
inner loop:   6%|▌         | 6.00/100 [00:06<01:34, 1.01s/it]
inner loop:   7%|▋         | 7.00/100 [00:07<01:34, 1.01s/it]
inner loop:   8%|▊         | 8.00/100 [00:08<01:33, 1.02s/it]
inner loop:   9%|▉         | 9.00/100 [00:09<01:32, 1.02s/it]
inner loop:  10%|█         | 10.0/100 [00:10<01:31, 1.02s/it]
inner loop:  11%|█         | 11.0/100 [00:11<01:30, 1.01s/it]
inner loop:  12%|█▏        | 12.0/100 [00:12<01:29, 1.01s/it]
inner loop:  13%|█▎        | 13.0/100 [00:13<01:28, 1.01s/it]
inner loop:  14%|█▍        | 14.0/100 [00:14<01:29, 1.04s/it]
inner loop:  15%|█▌        | 15.0/100 [00:15<01:27, 1.03s/it]
inner loop:  16%|█▌        | 16.0/100 [00:16<01:26, 1.02s/it]
inner loop:  17%|█▋        | 17.0/100 [00:17<01:24, 1.02s/it]
inner loop:  18%|█▊        | 18.0/100 [00:18<01:23, 1.02s/it]
inner loop:  19%|█▉        | 19.0/100 [00:19<01:22, 1.02s/it]
…………………………………………………………………………………………….
……………………………………………………………………………………………..
It will go till it reached at 100%.

讓我們理解另一個例子。

示例- 1


# importing modules
from tqdm import trange
from time import sleep

# creating loop
for i in trange(10, desc="loop "):
    # slowing the for loop
    sleep(0.1) 

輸出:

環路:100%|██████████| 10/10[00:01 < 00:00,9.08it/s]

示例-


# importing modules
from tqdm import tnrange
from time import sleep

# creating loop
for i in tnrange(2, dec="loop 1"):

    # creating nested loop
    for j in tnrange(5, dec="loop 2"):
        # slowing the for loop
        sleep(0.3)

輸出:

outer loop:   0%|          | 0/10 [00:00<?, ?it/s]
inner loop:   0%|          | 0.00/100 [00:00<?, ?it/s]
inner loop:   1%|          | 1.00/100 [00:01<01:39, 1.00s/it]
inner loop:   2%|▏         | 2.00/100 [00:02<01:38, 1.00s/it]
inner loop:   3%|▎         | 3.00/100 [00:03<01:37, 1.00s/it]
inner loop:   4%|▍         | 4.00/100 [00:04<01:36, 1.00s/it]
inner loop:   5%|▌         | 5.00/100 [00:05<01:35, 1.00s/it]
inner loop:   6%|▌         | 6.00/100 [00:06<01:34, 1.01s/it]
inner loop:   7%|▋         | 7.00/100 [00:07<01:33, 1.01s/it]
inner loop:   8%|▊         | 8.00/100 [00:08<01:32, 1.01s/it]
inner loop:   9%|▉         | 9.00/100 [00:09<01:31, 1.00s/it]
inner loop:  10%|█         | 10.0/100 [00:10<01:30, 1.01s/it]

示例-3


# importing modules
import time
import sys
from tqdm import trange

# creating random function
def random_function():
    time.sleep(0.5)

# another random function
def another_random_function():
    time.sleep(0.2)

# defining outer loop
for i in trange(3, file=sys.stdout, desc='Outer loop'):
    random_function()

    # inner loop
    for j in trange(5, file=sys.stdout, desc='Inner loop'):
        another_random_function()

輸出:

Outer loop:   0%|          | 0/3 [00:00<?, ?it/s]
Inner loop:   0%|          | 0/5 [00:00<?, ?it/s]
Inner loop:  20%|██        | 1/5 [00:00<00:00,  4.62it/s]
Inner loop:  40%|████      | 2/5 [00:00<00:00,  4.64it/s]
Inner loop:  60%|██████    | 3/5 [00:00<00:00,  4.63it/s]
Inner loop:  80%|████████  | 4/5 [00:00<00:00,  4.65it/s]
Outer loop:  33%|███▎      | 1/3 [00:01<00:03,  1.58s/it]
Inner loop:   0%|          | 0/5 [00:00<?, ?it/s]
Inner loop:  20%|██        | 1/5 [00:00<00:00,  4.91it/s]
Inner loop:  40%|████      | 2/5 [00:00<00:00,  4.85it/s]
Inner loop:  60%|██████    | 3/5 [00:00<00:00,  4.79it/s]
Inner loop:  80%|████████  | 4/5 [00:00<00:00,  4.77it/s]
Outer loop:  67%|██████▋   | 2/3 [00:03<00:01,  1.58s/it]
Inner loop:   0%|          | 0/5 [00:00<?, ?it/s]
Inner loop:  20%|██        | 1/5 [00:00<00:00,  4.43it/s]
Inner loop:  40%|████      | 2/5 [00:00<00:00,  4.56it/s]
Inner loop:  60%|██████    | 3/5 [00:00<00:00,  4.65it/s]
Inner loop:  80%|████████  | 4/5 [00:00<00:00,  4.72it/s]
Outer loop: 100%|██████████| 3/3 [00:04<00:00,  1.57s/it]

進度條的預測性手動更新

tqdm模塊提供了一種在特定時間間隔手動更新進度條的工具。當我們以塊或流數據下載多部分文件時,我們可以手動更新進程欄功能。讓我們理解下面的例子。

示例-


# importing modules
import time
import sys
from tqdm import tqdm

def task():
    time.sleep(1)

with tqdm(total=100, file=sys.stdout) as pbar:
    for i in range(10):
        task()
        # Here we are updating progress bar manually, useful for streams such as reading files.
        pbar.update(10)
        # Updates in increments of 10 stops at 100

輸出:

100%|██████████| 100/100 [00:10<00:00, 9.93it/s]

解釋-

在上面的代碼中,我們將屬性設置為 100。被調用的函數在每次迭代中遞增 10,直到達到 100%。我們可以將任何值傳遞給 update()方法。

螺紋進度條

我們還可以將 Python tqdm 包捕獲到 Python 線程中。多進程是使用內核總數的最佳方式。tqdm 位置參數允許我們指定列印該條的行偏移量。在沒有腳本的情況下,默認設置為自動。讓我們理解下面的例子。必須指定該值才能同時管理多個條。如果我們忽略這個參數,我們的條將被不同的線程覆蓋。

示例-


import time

from random import randrange
from multiprocessing.pool import ThreadPool

from tqdm import tqdm

def func_call(position, total):
    text = 'progressbar #{position}'.format(position=position)
    with  tqdm(total=total, position=position, desc=text) as progress:
        for _ in range(0, total, 5):
            progress.update(5)
            time.sleep(randrange(3))

pool = ThreadPool(10)
tasks = range(5)
for i, url in enumerate(tasks, 1):
    pool.apply_async(func_call, args=(i, 100))
pool.close()
pool.join()

輸出:

progressbar #5:   0%|          | 0/100 [00:00<?, ?it/s]
progressbar #2:   0%|          | 0/100 [00:00<?, ?it/s]
progressbar #1:   0%|          | 0/100 [00:00<?, ?it/s]
progressbar #4:   0%|          | 0/100 [00:00<?, ?it/s]
progressbar #3:   0%|          | 0/100 [00:00<?, ?it/s]
progressbar #3:  10%|█         | 10/100 [00:01<00:09,  9.91it/s]
progressbar #5:  10%|█         | 10/100 [00:01<00:09,  9.91it/s]
progressbar #1:  10%|█         | 10/100 [00:02<00:18,  4.97it/s]
progressbar #2:  10%|█         | 10/100 [00:02<00:18,  4.96it/s]
progressbar #4:  10%|█         | 10/100 [00:02<00:18,  4.96it/s]
progressbar #5:  15%|█▌        | 15/100 [00:02<00:11,  7.64it/s]
progressbar #3:  15%|█▌        | 15/100 [00:02<00:11,  7.64it/s]
progressbar #4:  15%|█▌        | 15/100 [00:03<00:17,  4.96it/s]
progressbar #2:  15%|█▌        | 15/100 [00:03<00:17,  4.95it/s]
progressbar #3:  20%|██        | 20/100 [00:04<00:16,  4.71it/s]
progressbar #5:  25%|██▌       | 25/100 [00:04<00:11,  6.58it/s]
progressbar #1:  20%|██        | 20/100 [00:04<00:16,  4.97it/s]
progressbar #2:  20%|██        | 20/100 [00:04<00:16,  4.96it/s]

在 Tqdm 進度條中添加顏色

顏色可以使進度條非常吸引人。然而,它並沒有給酒吧的工作增加任何新的功能。tqdm 可以和 Colorama 一起工作,Colorama 是 Python 中一種簡單的跨平台彩色終端文本。讓我們理解下面的例子。

示例-


from tqdm import trange
from colorama import Fore

# Cross-platform colored terminal text.
color_bars = [Fore.BLACK,
    Fore.RED,
    Fore.GREEN,
    Fore.YELLOW,
    Fore.BLUE,
    Fore.MAGENTA,
    Fore.CYAN,
    Fore.WHITE]

for color in color_bars:
    for i in trange(int(7e7),
                    bar_format="{l_bar}%s{bar}%s{r_bar}" % (color, Fore.RESET)):
        pass

輸出:

結論

我們已經討論了與進度條相關的所有基本概念。Python 附帶了 tqdm模塊,可以幫助我們手動設計。我們已經為可以在 tqdm模塊中執行的重要操作定義了合適的示例。tqdm模塊可以與子流程和線程協作,在這裡我們可以同時運行多個流程條。


原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/305166.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2025-01-01 11:06
下一篇 2025-01-01 11:06

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智慧、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29

發表回復

登錄後才能評論