使用 tqdm 在 Python 应用中显示进度

开发 后端
如果你的程序需要一段时间才能显示结果,可通过显示它的进度来避免让用户感到沮丧。

阿拉米语,希伯来语和阿拉伯语中的闪米特语根 q-d-m 通常与前进或进度有关。阿拉伯语 taqaddum (تقدّم)的意思是“进度”。进度是很重要的。正如每部感觉良好的电影都会告诉你,旅程和目的地同样重要。

大多数程序都有一个明确的目标,一个期望的最终状态。有时,计算这个最终状态可能需要很长的时间。虽然计算机没有感情不在乎,但人却在乎。人类并不乐意坐在原地等待,而看不到任何明显的进展迹象。疑问不断蔓延。程序崩溃了吗?磁盘性能是否抖动?操作系统是否把所有的计算资源都分配给了其他任务?

就像正义一样,进度必须被看到,而不仅仅是完成。Python 库 tqdm 有助于使进度变得明确。

tqdm 模块可在控制台下工作,但它也专门支持了我最喜欢的环境之一 Jupyter。要在 Jupyter 中使用 tqdm,你需要导入 notebook 子模块并安装 ipywidgets 。notebook 子模块与 tqdm 接口兼容。

这意味着你可以做一些导入时操作来导入正确的模块,同时保持 tqdm 的用法不变。诀窍是检查 __main__ 模块是否具有全局变量 get_ipython。虽然这只是一个启发式的方法,但却是一个相当准确的方法:

  1. import sys 
  2. if hasattr(sys.modules["__main__"], "get_ipython"): 
  3.     from tqdm import notebook as tqdm 
  4. else: 
  5.     import tqdm 

最简单的情况是,某件事情需要运行一定的迭代次数(事先已知),而每一次迭代的时间都差不多。例如,有一个计算任何数字的平方根的算法,通过从 1 作为猜测值开始,然后计算出一个改进后的猜测值:

  1. def improve_guess(rt, n): 
  2.     return (rt + n/rt) / 2 

一点点的改进可以让你更加接近该平方根。例如,你可以计算 2 的平方根:

  1. guess = 1 
  2. target = 2 
  3. for i in tqdm.trange(10): 
  4.     guess = improve_guess(guess, target) 

 

使用 tqdm 在 Python 应用中显示进度

精确了到小数点后 10 位!

 

  1. round(2 - guess*guess, 10) 
  1. 0.0 

一个稍微复杂一点的例子是,当元素的数量是已知的,而处理每个元素需要类似的时间。例如,你可以计算一些数字的乘积。为此,你需要一些随机数:

  1. import random 
  2. numbers = [random.uniform(0, 2.8) for i in range(100)] 
  3. numbers[:5] 
  1. [2.6575636572230916, 
  2. 0.1286674965830302, 
  3. 1.0634250104041332, 
  4. 1.1760969844376505, 
  5. 0.45192978568125486] 

现在有了这些数字,可以将它们相乘了。使用 tqdm 最简单的方法是包装一个 Python 迭代函数。数值是一样的,但是 tqdm 会显示一个进度条:

  1. result = 1 
  2. for num in tqdm.tqdm(numbers): 
  3.     result *= num 
  4. result 
  1. 2.4081854901728303 

使用 tqdm 在 Python 应用中显示进度

tqdm output

然而,并不是所有的事情都可以预测。最不容易预测的事情之一就是网络速度。当你下载一个大文件时,衡量进度的唯一方法就是检查已经下载了多少:

  1. url = "https://www.python.org/ftp/python/3.9.0/Python-3.9.0.tgz" 
  2. import httpx 
  3. with httpx.stream("GET", url) as response: 
  4.     total = int(response.headers["Content-Length"]) 
  5.     with tqdm.tqdm(totaltotal=total) as progress: 
  6.         for chunk in response.iter_bytes(): 
  7.             progress.update(len(chunk)) 

使用 tqdm 在 Python 应用中显示进度

tqdm output

有时,“嵌套”进度条是有意义的。例如,如果你要下载一个目录,你就需要一个进度条来跟踪文件,并为每个文件设置一个进度条。

下面是一个例子(但没有实际下载一个目录):

  1. files = [f"vid-{i}.mp4" for i in range(4)] 
  2. for fname in tqdm.tqdm(files, desc="files"): 
  3.     total = random.randrange(10**9, 2 * 10**9) 
  4.     with tqdm.tqdm(totaltotal=total, desc=fname) as progress: 
  5.         current = 0 
  6.         while current < total: 
  7.             chunk_size = min(random.randrange(10**3, 10**5), total - current) 
  8.             current += chunk_size 
  9.             if random.uniform(0, 1) < 0.01: 
  10.                 time.sleep(0.1) 
  11.             progress.update(chunk_size) 

使用 tqdm 在 Python 应用中显示进度

tqdm output

所以,如果你的程序需要一段时间才能显示最终结果,为避免让你的用户感到沮丧。请显示它的进度!

 

责任编辑:赵宁宁 来源: Linux中国
相关推荐

2020-12-14 13:32:40

Python进度条参数

2021-06-15 08:02:27

Python进度条Tqdm

2023-03-06 07:25:17

LinuxAdvanced

2013-01-05 13:50:13

AjaxWebASP.NET MVC

2009-08-27 14:01:41

C#进度条

2022-12-06 23:43:53

iOSCreateML应用

2021-04-12 16:18:24

CPUFetchLinuxCPU

2022-06-28 09:10:28

Linuxtree命令

2010-03-15 10:24:20

Python函数变量

2022-04-04 21:33:48

进度条Python

2023-12-07 08:22:58

Android应用

2011-08-29 17:27:47

HTML 5交互移动应用

2010-03-19 15:16:11

Python代码

2010-03-24 14:37:29

Python编程语言

2010-03-19 17:15:43

2010-03-03 17:52:31

Python线程同步

2021-07-30 20:25:04

pipxPython编程语言

2011-06-15 17:45:23

Qt 横屏 竖屏

2021-09-12 12:00:12

浏览器LinuxWeb 应用

2011-08-19 17:44:01

点赞
收藏

51CTO技术栈公众号