tqdm-python實現進度條

python實現進度條—查看代碼運行進度

1、前言python

\quad \quad 有時候在使用Python處理比較耗時操做的時候,爲了便於觀察處理進度,這時候就須要經過進度條將處理狀況進行可視化展現,以便咱們可以及時瞭解狀況。這對於第三方庫很是豐富的Python來講,想要實現這一功能並非什麼難事。
\quad \quad tqdm就能很是完美的支持和解決這些問題,能夠實時輸出處理進度並且佔用的CPU資源很是少,支持循環處理多進程遞歸處理、還能夠結合linux的命令來查看處理狀況,等進度展現。
linux

咱們先來看一下進度條的效果。dom

from tqdm import tqdm
for i in tqdm(range(int(9e6))):
    pass

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-XnbUf9aE-1604921463438)(C:\Users\Admin\Desktop\test.gif)]

能夠看到,當咱們的代碼的運行須要較長時間時,進度條能夠很好的幫助咱們瞭解整個代碼的運行進度。工具

一、安裝post

tqdm的安裝十分簡單,只須要經過pip或conda就能夠安裝。spa

二、pip安裝code

pip install tqdm

三、conda安裝對象

conda install -c conda-forge tqdm

2、tqdm相關操做blog

一、迭代對象處理遞歸

對於能夠迭代的對象均可以使用下面這種方式,來實現可視化進度,很是方便。

from tqdm import tqdm
import time
for i in tqdm(range(100)):
    time.sleep(0.1)
    pass
100%|████████████████████████████████████████████████████████████████████████████████| 100/100 [00:10<00:00,  9.88it/s]

二、觀察處理的數據

經過tqdm提供的set_description方法能夠實時查看每次處理的數據。

from tqdm import tqdm
import time

pbar = tqdm(["A","B","C","D","E","F"])
for c in pbar:
    time.sleep(1)
    pbar.set_description("Processing %s"%c)

在這裏插入圖片描述

三、pandas中使用tqdm

pandas中對大量數據進行相關操做或者遍歷表格的行列時,咱們能夠使用tqdm來了解代碼運行狀況。

import pandas as pd
df = pd.DataFrame({ 
    'Month':[1,2,3,4,5,2,3,4,5,1,2,3,4],
    'Name':['張三','張三','張三','張三','張三','李四','李四','李四','李四','王五','王五','王五','王五'],
    'Sex':['男','男','女','女','女','男','男','男','男','女','女','女','女']})
for i in tqdm(['Month','Name','Sex']):
    pass
100%|██████████████████████████████████████████████████████████████████████████████████| 3/3 [00:00<00:00, 4707.41it/s]

四、多進程進度條

在使用多進程或者嵌套循環處理任務的時候,咱們經過tqdm能夠實時查看每個進程任務的處理狀況

from tqdm import tqdm
import time
for i in tqdm(range(5), ascii=True,desc="1st process"):
    for j in tqdm(range(5), ascii=True,desc="2nd process"):
        time.sleep(0.01)
1st process:   0%|                                                                               | 0/5 [00:00<?, ?it/s]
2nd process:   0%|                                                                               | 0/5 [00:00<?, ?it/s]
2nd process: 100%|#######################################################################| 5/5 [00:00<00:00, 94.27it/s]
2nd process:   0%|                                                                               | 0/5 [00:00<?, ?it/s]
1st process:  40%|############################4                                          | 2/5 [00:00<00:00, 18.09it/s]
2nd process:   0%|                                                                               | 0/5 [00:00<?, ?it/s]
2nd process: 100%|#######################################################################| 5/5 [00:00<00:00, 93.95it/s]
2nd process:   0%|                                                                               | 0/5 [00:00<?, ?it/s]
1st process:  80%|########################################################8              | 4/5 [00:00<00:00, 17.99it/s]
2nd process:   0%|                                                                               | 0/5 [00:00<?, ?it/s]
1st process: 100%|#######################################################################| 5/5 [00:00<00:00, 17.86it/s]

五、自定義進度條顯示信息

經過update方法能夠控制每次進度條更新的進度。

from tqdm import tqdm
import time
#total參數設置進度條的總長度爲100
with tqdm(total=100) as pbar:
    for i in range(100):
        time.sleep(0.05)
        #每次更新進度條的長度爲1
        pbar.update(1)

在這裏插入圖片描述

除了上述方法以外,咱們還能經過另一種方法來實現操做。

from tqdm import tqdm
import time
#total參數設置進度條的總長度爲100
pbar = tqdm(total=100)
for i in range(100):
    time.sleep(0.05)
    #每次更新進度條的長度爲1
    pbar.update(1)
#關閉佔用的資源
pbar.close()

在這裏插述

另外,咱們還能經過set_descriptionset_postfix方法設置進度條顯示信息。

from tqdm import trange
from random import random,randint
import time

with trange(100) as t:
    for i in t:
        #設置進度條左邊顯示的信息
        #注意:代碼中的HVAE是能夠手動換成其餘內容的
        t.set_description("GEN %i"%i)
        #設置進度條右邊顯示的信息 
        #注意:此處代碼中的gen lr lst是能夠手動換成其餘內容的
        t.set_postfix(loss=random(),gen=randint(1,999),lr="h",lst=[1,2])
        time.sleep(0.1)
GEN 99: 100%|███████████████████████████████| 100/100 [00:10<00:00,  9.77it/s, gen=190, loss=0.00811, lr=h, lst=[1, 2]]

使人震驚的是,當咱們將進度條顯示的信息設置中文時,居然不會出現亂碼!!!!

from tqdm import trange
from random import random,randint
import time

with trange(100) as t:
    for i in t:
        #設置進度條左邊顯示的信息
        t.set_description("進度 %i"%i)
        #設置進度條右邊顯示的信息 
        t.set_postfix(loss=random(),隨機=randint(1,999),名字="h",列表=[1,2])
        time.sleep(0.1)
進度 99: 100%|████████████████████████████████████| 100/100 [00:10<00:00,  9.75it/s, loss=0.975, 列表=[1, 2], 名字=h, 隨機=469]

3、其餘相關操做

​ Last but not least!!最後的內容是十分重要的!!

一、咱們在使用tqdm的時候,能夠將tqdm(range(n))替換爲trange(n),讓你的代碼看起來更加簡潔而又高大上!

from tqdm import tqdm,trange
import time
for i in trange(100):
    time.sleep(0.1)
    pass
100%|████████████████████████████████████████████████████████████████████████████████| 100/100 [00:10<00:00,  9.90it/s]

二、當咱們在jupyter notebook中使用進度條時,咱們會發現整個進度條十分的難看,而在可能會出現多條進度條的狀況,這樣會讓咱們的代碼顯得十分的難看,這顯然不是咱們想要獲得的結果。

咱們先來感覺一下,這種醜醜的運行結果。

from tqdm import tqdm
for i in tqdm(range(int(200))):
    print('tqdm',end=' ')
0%|                                                                                          | 0/200 [00:00<?, ?it/s]
tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm 
68%|█████████████████████████████████████████████████████▍                        | 137/200 [00:00<00:00, 1360.43it/s]

tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm tqdm 100%|██████████████████████████████████████████████████████████████████████████████| 200/200 [00:00<00:00, 1337.14it/s]

\quad 能夠看到,上面的代碼咱們僅僅打印了兩百次,整個運行結果就有多個進度條,總體的視覺效果特別差。若是當咱們須要進行成千上萬次迭代時,整個運行結果將會不堪入目,比咱們未使用進度條時的結果更加難看,顯然這不是咱們想看到的。

tqdm針對jupyter notebook添加了專門的進度條美化方法,使用tqdm_notebook()方法,咱們看看效果:

from tqdm import tqdm_notebook
import time
for i in tqdm_notebook(range(100),desc='demo:'):
    time.sleep(0.01)
    print('tqdm',end=' ')

在這裏插入圖片描述
能夠看到,整個運行結果馬上變得美觀而又清晰了!
\quad tqdm在阿拉伯語中的意思是「進展」,是python中一個快速、擴展性強的進度條工具庫,能讓咱們瞭解代碼的運行進度,也能讓咱們的運行結果看起來顯得更加美觀而又高大上!! 喜歡的小夥伴趕忙用起來吧!!

相關文章
相關標籤/搜索