每當我們安裝任何 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-hk/n/305166.html