亚拉姆语、希伯来语和阿拉伯语中的闪米特语根 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(猜测,目标)

tqdm 输出

图片来源:

(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

tqdm 输出

图片来源:

(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))

tqdm 输出

图片来源:

(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)

tqdm 输出

图片来源:

(摩西·扎德克,CC BY-SA 4.0)

因此,如果您的程序需要一段时间才能显示最终结果,请避免让您的用户感到沮丧:显示它正在取得的进展!

Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐