使用 tqdm 显示 Python 应用程序的进度
亚拉姆语、希伯来语和阿拉伯语中的闪米特语根 q-d-m 通常与前进或取得进展有关。阿拉伯语_taqaddum_ (تقدّم) 的意思是“进步”。进步很重要。正如每一部感觉良好的电影都会告诉你的那样,旅程与目的地一样重要。 更多 Python 资源 什么是 IDE? 备忘单:适用于初学者的 Python 3.7 顶级 Python GUI 框架 下载:7 个必不可少的 PyPI 库 红帽开发者 最
亚拉姆语、希伯来语和阿拉伯语中的闪米特语根 q-d-m 通常与前进或取得进展有关。阿拉伯语_taqaddum_ (تقدّم) 的意思是“进步”。进步很重要。正如每一部感觉良好的电影都会告诉你的那样,旅程与目的地一样重要。
更多 Python 资源
-
什么是 IDE?
-
备忘单:适用于初学者的 Python 3.7
-
顶级 Python GUI 框架
-
下载:7 个必不可少的 PyPI 库
-
红帽开发者
-
最新 Python 内容
大多数程序都有一个明确的目标,一个期望的最终状态。有时,计算该最终状态可能需要很长时间。虽然计算机不在乎,没有感觉,但人们却在乎。如果没有任何明显的进步迹象,人类会不高兴地坐在那里等待。怀疑蔓延。程序崩溃了吗?磁盘抖动吗?操作系统是否将其所有计算资源分配给其他任务?
就像正义一样,必须看到进步,而不仅仅是完成。tqdmPython 库有助于明确进度。
tqdm 模块可与控制台一起使用,但它还特别支持我最喜欢的环境之一:Jupyter。要在 Jupyter 中使用 tqdm,您需要导入notebook
子模块并安装ipywidgets。notebook
子模块与 tqdm 接口兼容。
这意味着您可以做一些导入时的恶作剧来导入正确的模块,同时保持 tqdm 的使用相同。诀窍是检查__main__
模块是否具有全局变量get_ipython
。虽然这是一种启发式方法,但它是一个相当准确的方法:
导入系统
如果有属性(sys.modules[“__main__”],“get_ipython”):
从 tqdm 导入笔记本为 tqdm
别的:
导入 tqdm
最简单的情况是需要运行一定数量的迭代(预先知道),并且每次迭代都需要大约相同的时间。例如,有一种算法可以计算任何数字的平方根,它从 1 作为猜测开始,然后计算改进的猜测:
def 改进_guess(rt, n):
返回 (rt + n/rt) / 2
少量的改进让你非常接近。例如,您可以计算两个的平方根:
猜测 \u003d 1
目标 \u003d 2
对于 tqdm.trange(10) 中的 i:
猜测\u003d改进_guess(猜测,目标)
图片来源:
(Moshe Zadke,CC BY-SA 4.0)
精确到小数点后 10 位!
round(2 - guess*guess, 10)
0.0
一个稍微复杂一点的例子是元素的数量是已知的,并且处理每个元素需要相似的时间。例如,您可以计算一些数字的乘积。为此,您需要一些随机数:
随机导入
数字 \u003d [random.uniform(0, 2.8) for i in range(100)]
数字[:5]
[2.6575636572230916,
0.1286674965830302,
1.0634250104041332,
1.1760969844376505,
0.45192978568125486]
现在数字已经出现,是时候将它们相乘了。使用 tqdm 最简单的方法是包装 Python 可迭代对象。值将相同,但 tqdm 也会显示一个进度条:
结果 \u003d 1
对于 tqdm.tqdm(数字)中的 num:
结果 *\u003d 数量
结果
2.4081854901728303
图片来源:
(Moshe Zadke,CC BY-SA 4.0)
然而,并不是所有的事情都是可以预测的。最不可预测的事情之一是网络速度。当您下载一个大文件时,衡量进度的唯一方法是明确检查已下载了多少:
网址\u003d“https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tgz”
导入httpx
以 httpx.stream("GET", url) 作为响应:
总计 \u003d int(response.headers["Content-Length"])
以 tqdm.tqdm(total\u003dtotal) 作为进度:
对于 response.iter_bytes() 中的块:
progress.update(len(chunk))
图片来源:
(Moshe Zadke,CC BY-SA 4.0)
有时,“嵌套”进度条是有意义的。例如,如果您正在下载一个目录,您将需要一个跟踪文件的进度条和每个文件的进度条。
这是一个示例(但没有实际下载目录):
文件 \u003d [f"vid-{i}.mp4" for i in range(4)]
对于 tqdm.tqdm(files, desc\u003d"files") 中的 fname:
总计 \u003d random.randrange(10**9, 2 * 10**9)
以 tqdm.tqdm(total\u003dtotal, desc\u003dfname) 作为进度:
当前\u003d 0
而当前<总计:
chunk\size \u003d in(random.randrange(10**3, 10**5), 总计 - 当前)
当前 +\u003d 块_size
如果 random.uniform(0, 1) < 0.01:
时间.睡眠(0.1)
进度.更新(块_size)
图片来源:
(摩西·扎德克,CC BY-SA 4.0)
因此,如果您的程序需要一段时间才能显示最终结果,请避免让您的用户感到沮丧:显示它正在取得的进展!
更多推荐
所有评论(0)