进度条模块tqdm介绍

2020年10月5日 / 77次阅读 / Last Modified 2021年1月12日

因为看到别人的jupyter notebook能够显示很漂亮的进度条,所有查询了一番,原来有个tqdm模块,专门负责python代码的进度条显示。

tqdm derives from the Arabic word taqaddum (تقدّم) which can mean “progress,” and is an abbreviation for “I love you so much” in Spanish (te quiero demasiado).

tqdm来自阿拉伯语taqaddum,就是进度的意思;同时它还是西班牙语“我非常爱你”的缩写!

安装tqdm就跳过了,pip即可。

使用很简单,将你代码中iterable对象包在tqdm函数中即可,如下:

>>> from tqdm import tqdm, trange
>>> a = [x for x in range(10000)]
>>> for it in tqdm(a):
...     pass
...
100%|████████████████████████████████████████████████████████████████████████| 10000/10000 [00:00<00:00, 1026280.07it/s]

trange就是tqdm(range(N)的一个简单替换

>>> for i in trange(10000):
...     pass
...
100%|████████████████████████████████████████████████████████████████████████| 10000/10000 [00:00<00:00, 1013680.06it/s]

ncols参数控制进度条的宽度:

>>> for i in trange(10000, ncols=100):
...   pass
...
100%|█████████████████████████████████████████████████████| 10000/10000 [00:00<00:00, 971983.69it/s]
>>> for i in trange(10000, ncols=10):
...  pass
...
100%|█| 10

ascii=True的效果:

>>> for i in trange(10000, ncols=100, ascii=True):
...     pass
...
100%|#####################################################| 10000/10000 [00:00<00:00, 989339.31it/s]

加上一个desc描述的效果:

>>> for i in trange(10000, desc="Progress:"):
...     pass
...
Progress:: 100%|██████████████████████████████████████████████████████████████| 10000/10000 [00:00<00:00, 995042.70it/s]

jupyter notebook中的进图条,都是tqdm在背后支持。

tqdm的overhead很小,每个loop只有60ns,tqdm.gui只有80ns。

通过tqdm提供的set_description方法可以实时查看每次处理的数据:

>>> import time
>>> from tqdm import tqdm
>>> pbar = tqdm([1,3,5,7,9])
  0%|                                                                                                                                          | 0/5 [00:00>> for i in pbar:
...     time.sleep(1)
...     pbar.set_description('dealing with %d' % i)
...
dealing with 9: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 5/5 [00:38<00:00,  7.73s/it]
>>>

进度条前面的 dealing with 会一直变化!

还有个set_postfix函数,用来设置进度条后面部分显示的信息:

$ cat t_tqdm.py
from tqdm import tqdm,trange
import time
import random


with trange(100,ncols=60) as pbar:
    for i in pbar:
        time.sleep(0.1)
        pbar.set_postfix(a='wtf',b=random.randint(0,999))

运行效果:

$ python3 t_tqdm.py
 60%|████▊   | 60/100 [00:06<00:04,  9.83it/s, a=wtf, b=497]

update函数,用来控制每次进度条进行的幅度:

$ cat t_tqdm.py
from tqdm import tqdm
import time

# total参数设置进度条的总长度
with tqdm(total=100) as pbar:
    for i in range(10):
        time.sleep(1)
        pbar.update(10)

这段代码会显示出进度条每次往前走10%的效果。

在现实进度条的循环内,不要使用print输出,这样会导致进度条重复显示,很难看,此时可以用tqdm.write函数来代替:

$ cat t_tqdm.py
from tqdm import tqdm,trange
import time


for i in trange(100):
    time.sleep(.1)
    tqdm.write('okok..')

这段代码的运行效果如下:

$ python3 t_tqdm.py
okok..
okok..
okok..
okok..
okok..
okok..
okok..
okok..
okok..
okok..
okok..
okok..
okok..
okok..
okok..
okok..
okok..
okok..
okok..
okok..
 20%|█████████████████████████▍                                                                                                     | 20/100 [00:02<00:08,  9.83it/s]

tqdm还在在命令行中,通过pipeline被使用。

-- EOF --

本文链接:https://www.pynote.net/archives/2530

相关文章

    留言区

    《进度条模块tqdm介绍》有1条留言

    邮箱地址不会被公开。 必填项已用*标注

    • 麦新杰

      貌似tqdm在cmd模式下,就无法进行多进度条的体面展现,比如在一个进度条中再嵌套一个进度条。? (有必要这样吗?完全可以只用一个进度条来显示整体进度,或者使用tqdm.write来显示子进度) [回复]


    前一篇:
    后一篇:

    More


    ©Copyright 麦新杰 Since 2019 Python笔记

    go to top