给程序加个进度条——tqdm

2022-12-06 14:41:56 浏览数 (1)

一、tqdm 简介

tqdm 来自阿拉伯语taqaddum,意思是进展(progress),并且在西班牙语中是我非常爱你(te quiero demasiado)的缩写[1]。

tqdm的作用是显示程序的进度。用于任何平台(Linux, Windows,Mac等),在任何控制台或GUI中,并且对IPython/Jupyter笔记本也很友好。

注:大多数图形库都有自己的进度条,tkinter.ttk 的Progressbar,Qt的QProgressBar......。

使用时只需要用tqdm包装可迭代的对象:tqdm(iterable)。例如:

代码语言:javascript复制
from tqdm import tqdm
lst = []
for i in tqdm(range(10**8)):
    lst.append(i**2)

可以看到当前的进度,已用时间、(预计)剩余时间信息

二、其它用法

2.1 对可迭代对象

tqdm可以对任意可迭代对象使用。例如数组:

代码语言:javascript复制
from tqdm import tqdm
from time import sleep

text = ""
for char in tqdm(["a", "b", "c", "d"]):
    sleep(0.25)
    text = text   char

trange(i)可以看作tqdm(range(i))的一个特殊优化:

代码语言:javascript复制
from tqdm import trange

for i in trange(100):
    sleep(0.01)

tqdm可以用于列表推导中:

代码语言:javascript复制
lst = [x**2 for x in tqdm(range(10**8))]

注意,对于某些装饰生成器(Wrapping generators): 生成器包装器函数倾向于隐藏可迭代对象的长度。tqdm不会。 将 tqdm(enumerate(...)) 替换为 enumerate(tqdm(...))tqdm(enumerate(x), total=len(x), ...)。对于 numpy.ndenumerate也是。 将 tqdm(zip(a, b)) 替换为 zip(tqdm(a), b)zip(tqdm(a), tqdm(b))。 这同样适用于 itertools。 一些有用的便利功能可以在 tqdm.contrib下找到。 pypi

2.2 手动控制tqdm更新

通过update()手动更新进度条

代码语言:javascript复制
with tqdm(total=100) as pbar:
    for i in range(10):
        sleep(0.1)
        pbar.update(10)

也可以不用with,但是要在最后手动调用close()方法。

代码语言:javascript复制
pbar = tqdm(total=100)
for i in range(10):
    sleep(0.1)
    pbar.update(10)
pbar.close()

2.3 个性化设置进度条信息

可以设置进度条显示的信息[2]:

代码语言:javascript复制
import time
import random
from tqdm import tqdm, trange
t = trange(100)
for i in t:
    t.set_description(f"第{i}次迭代")
    sleeping_time = random.randint(1,100)/100
    t.set_postfix(sleeping_time=sleeping_time)
    time.sleep(sleeping_time)
    if i % 10 == 0:
        for _ in trange(10):
            time.sleep(0.5)
t.close()

2.4 在命令行中在管道之间使用

用于命令行中,只需要在管道之间插入tqdm(或python -m tqdm)即可将所有stdin传递到stdout,同时将进度打印到stderr。下面的示例演示了计算在当前目录中的所有Python文件的行数 ,包含计时信息[1]。

代码语言:javascript复制
$ time find . -name '*.py' -type f -exec cat {} ; | wc -l
857365

real    0m3.458s
user    0m0.274s
sys     0m3.325s

$ time find . -name '*.py' -type f -exec cat {} ; | tqdm | wc -l
857366it [00:03, 246471.31it/s]
857365

real    0m3.585s
user    0m0.862s
sys     0m3.358s

参考

1.pypi的tqdm介绍:https://pypi.org/project/tqdm/ 2.Professional Progress Bars in Python:https://www.youtube.com/watch?v=oJLaA7-i3nI

0 人点赞