一、tqdm 简介
tqdm
来自阿拉伯语taqaddum
,意思是进展(progress),并且在西班牙语中是我非常爱你(te quiero demasiado)的缩写[1]。
tqdm
的作用是显示程序的进度。用于任何平台(Linux, Windows,Mac等),在任何控制台或GUI中,并且对IPython/Jupyter笔记本也很友好。
注:大多数图形库都有自己的进度条,tkinter.ttk 的Progressbar,Qt的QProgressBar......。
使用时只需要用tqdm
包装可迭代的对象:tqdm(iterable)
。例如:
from tqdm import tqdm
lst = []
for i in tqdm(range(10**8)):
lst.append(i**2)
可以看到当前的进度,已用时间、(预计)剩余时间信息
二、其它用法
2.1 对可迭代对象
tqdm
可以对任意可迭代对象使用。例如数组:
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))
的一个特殊优化:
from tqdm import trange
for i in trange(100):
sleep(0.01)
tqdm
可以用于列表推导中:
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()
手动更新进度条
with tqdm(total=100) as pbar:
for i in range(10):
sleep(0.1)
pbar.update(10)
也可以不用with
,但是要在最后手动调用close()
方法。
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]。
$ 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