如何使用 tqdm 创建 Python 终端进度条?

2023-10-25

进度条是估算和显示任务所需时间的宝贵工具。
这些也可以添加到您的 Python 脚本或代码块中,以指示代码执行所需的时间。
Python 中有多种可用的库,例如progressbar and tqdm可以用于此目的。

 

 

什么是 tqdm?

tqdm是一个 Python 库,它提供了包装指定迭代的函数,以提供智能进度条作为输出。
Python 是一种广泛使用的语言,用于执行长时间运行的计算密集型任务。
tqdm进度条指示这些任务的进度。

“tqdm”这个名字源自阿拉伯语单词“taqadum”,在阿拉伯语中意思是进步。
该库确实允许自定义进度条,但是在其基础上,
代码tqdm(iterable)足以让您开始使用显示可迭代进度的智能进度表。

 

安装tqdm进度

使用前tqdm,您需要使用 pip 安装它。你可以运行:


pip install tqdm  

对于Python3:


pip3 install tqdm  

对于 conda 环境,您可以运行:


conda install tqdm  

安装完成后,您可以包装任何可迭代对象(例如范围、列表、元组等)在函数内部tqdm.tqdm()
例如,在使用 for 循环遍历可迭代对象时查看可迭代对象的迭代进度。


from tqdm import tqdm
for i in tqdm(range(0,100)): 
    pass # do nothing
  

Output:

在此代码中,我们首先导入 tqdm 库。
然后我们编写一个普通的 for 循环来迭代range对象,除了我们传递range方法内的对象tqdm of the tqdm module.
由于 for 循环不能为空,并且我们不想在循环中执行任何操作,因此我们使用pass关键词。

NOTE:确保您没有将使用 tqdm 库的文件命名为tqdm.py.
这可能会导致不需要的输出,因为您的文件最终可能会覆盖tqdm从同一目录运行的所有 Python 代码的库。

 

打印带有进度条的消息

良好的开发人员实践不仅包括通过描述性注释使代码不言自明,
而且还使代码的输出尽可能具有描述性和不言自明的作用。
作为朝这个方向迈出的一步,我们可以在终端中打印文本和进度条,以指示正在执行的代码的目的,或添加任何其他所需的注释。

为此,您需要在中设置 desc 参数tqdm带有您想要的注释的函数调用。
然后,该文本将打印在终端进度条旁边。


from tqdm import tqdm
for i in tqdm(range(0,100),desc="This loop does nothing"): 
    pass
  

Output:

 

嵌套进度条

Tqdm 条还可用于指示嵌套循环的进度。
将显示多个指示每个循环进度的条。
在下面的代码中,我们将使用标签“外循环”和“内循环”来显示各自的进度条。


from tqdm import tqdm
from tqdm import trange
for i in tqdm(range(5), desc='Progress of Outer loop'):
    for j in trange((100), desc='Progress of inner loop'):
        pass
  

Output:

一段时间后,我们看到多个条,每个条对应一个内部循环,
而只有一个进度条显示外循环的进度

请注意,在上面的代码中,我们使用了trangetqdm 库中的函数。
此函数可替代使用 tqdm 函数的范围对象参数。
The trange函数调用指示将在给定范围内显示 tqdm 条,并且可以以相同的方式使用 tqdm 的所有附加功能(例如 desc)。

 

带有异步任务的 tqdm

为了在 Python 中运行并发任务,我们使用asyncio包裹。
它采用单线程、单进程设计,并使用“协作多任务”来给人一种并发的感觉。
在执行任务时asyncio库,我们可以使用tqdm进度条来跟踪其进度。
以下代码示例同时运行多个睡眠线程,并且 tqdm 条围绕任务以显示进度条。


import asyncio
import time
import tqdm
import tqdm.asyncio
async def sleep_duration(value = 1):
    start_time = time.time()
    await asyncio.sleep(delay=value)
    ending_time = time.time()
    intermittent_time = ending_time - starting_time
    return intermittent_time
async def run_async(values):
    taskslist = []
    for value in range(len(values)):
        i_task = asyncio.create_task(sleep_duration(value=value))
        taskslist.append(i_task)
    actual_async = [
    await x
    for x in tqdm.tqdm(asyncio.as_completed(taskslist), total=len(taskslist))
    ]
    return actual_async
n = 10
values = [3.12,3.44,4.66,2.33,1.87,4.77,5.68]
actual_async = asyncio.run(
        run_async(values=values))

  

Output:

上面的代码示例可能有点难以理解,这对于使用异步等待模式的 Python 代码来说很正常!
run_async用于使用借助以下方法获得的协程来运行多个睡眠线程sleep_duration使用的函数时间模块来测量间歇时间。
tqdm.tqdm围绕异步进程来生成进度条。
The total参数是可选的,可以在asyncio.as_completed使用包装器。

 

附加 tqdm 参数

The tqdm进度条有一些附加功能,可以在一些附加参数的帮助下调用。
以下是其中一些的列表:

1. total– 如果尚未隐式指定(例如,通过可迭代的长度),则可以通过设置显式指定迭代总数total范围。


from tqdm import tqdm
from time import sleep
for i in tqdm(range(0, 50), total = 10,
              desc ="total demo"):
    sleep(1)
  

 

Output:

这里,由于我们指定总迭代次数为 10,因此进度条只会在前 10 次迭代时显示,之后就会消失。
这是 10 次迭代结束后的样子:

Output:

2. ncols– 描述文本的宽度(由desc参数)以及进度条,是根据窗口的大小动态确定的。
但是,我们可以借助以下方法来修复此宽度ncols范围。
在下面的示例中,文本和进度条将仅使用输出屏幕的 40 列显示,尽管还有更多列可用。


from tqdm import tqdm
from time import sleep
for i in tqdm(range(0, 50), ncols = 40,
               desc ="ncols demo"):
    sleep(1)
  

 

Output:

3. initial – The initial如果您希望从任意值(例如 50 而不是标准 0)开始进度,可以设置参数。


from tqdm import tqdm
from time import sleep
for i in tqdm(range(0, 20), initial = 10,
              desc ="initial demo"):
    sleep(1)
  

 

Output:

上面的输出是第一次迭代的快照。
进度条出现并在前 10 次迭代中显示迭代“11-20”,然后在剩余迭代中消失

4. disable– 可以通过设置禁用进度条disable参数为True.


from tqdm import tqdm
from time import sleep
for i in tqdm(range(0, 10), disable = True,
               desc ="disable demo"):
    sleep(1)
  

 

Output:

从输出中可以看出,在整个迭代过程中没有出现任何内容。
使用此参数与根本不使用 tqdm 库一样好!

5. 最小间隔– 默认情况下,进度条每 0.1 秒更新一次。这种行为可以通过使用来改变mininterval范围。


from tqdm import tqdm
from time import sleep
for i in tqdm(range(0, 50), mininterval = 5,
              desc ="min interval demo"):
    sleep(1)
  

 

前5秒的输出:

接下来 5 秒(第 5 到 10 秒)的输出:

 

与熊猫集成

Pandas是一个流行的库,主要用于操作数值数据。
它是当今处理表格数据最常用的库之一。
Pandas 使用两种不同的数据类型进行数据表示,“Series”和“数据框‘.
虽然 Series 是一种一维数据结构,类似于 Excel 工作表中的列,
DataFrame是一种具有行和列的二维数据结构,也可以表示异构数据。
由于 pandas 是建立在NumPy库,它广泛应用于数据科学领域。

在 pandas 中,您可以使用apply方法将函数应用于一系列的每个值或数据帧的每个行/列。
我们可以通过此方法使用 tqdm 进度条。
要使用 pandas,首先使用 pip 安装它:


pip install pandas  

(对于Python3,替换pip with pip3,对于 conda 环境,将其替换为conda)


import pandas as pd
import numpy as np
from tqdm import tqdm
df = pd.DataFrame(np.random.randint(0, 100, (100, 100)))
print(df.head(10).iloc[:,:5]) #print first 10 rows and first 5 columns
tqdm.pandas(desc='pandas integration demo')
df=df.progress_apply(lambda number:number +5) #add 5 to each number
print(df.head(10).iloc[:,:5])
  

Output:

导入后pandas and tqdm库中,我们用 0 到 100 之间的随机整数初始化一个大小为 100×100 的数据帧。
现在我们使用tqdm.pandas方法来注册pandas.progress_apply与 tqdm 一起使用。
现在,而不是通常的apply函数,我们使用progress_apply函数显示 tqdm 条以表示进度百分比。
这俩apply and progress_apply方法接受函数作为参数。
在我们的例子中,我们传递一个 lambda 函数,该函数接受一个数字并加 5,然后返回它。

 

全面质量管理笔记本

Jupyter 笔记本是开源笔记本,可以运行多种编程语言,例如 Python、R,尽管 Python 用户最常使用它。
它提供了一个实时、交互式的 Python 运行时环境。
以交互方式检查数据或逐步测试 ML 管道的组件是一种流行的选择,尤其是在 ML 从业者和数据工程师中。

我们可以在 jupyter 笔记本中显示 tqdm 加载器。
设置 Jupyter Notebook 后,同时使用tqdm仍然有些相似,tqdm.notebook 模块用于在笔记本中显示进度条。
Runpip3 install ipywidgets确保进度条在笔记本中显示并动态更新。
tqdm 笔记本栏可以包含以下三种颜色之一:
绿色表示已成功完成该过程。
蓝色表示正在进行的过程。
红色表示已中途终止的进程。


from tqdm.notebook import tqdm_notebook
import time
for i in tqdm_notebook(range(15), desc = 'Tqdm notebook’):
    time.sleep(1.5)
  

正在进行的过程的输出:

终止进程的输出:

成功过程的输出:

与 tqdm 类似,tqdm_notebook应该包裹在一个可迭代对象周围。
笔记本功能还可以通过使用关键字(例如 using)与 tqdm 库的所有功能一起使用desc打印进度条描述的关键字,total指定总迭代次数等。

 

全面质量管理的替代方案

tqdm是一个强大的工具,用于跟踪 Python 中的操作进度。
除了 tqdm 之外,还可以使用其他几个库来实现相同或相似的目标。
其中一些库是progressbarprogressbar2, and alive-progress.

progressbar是一个简单的库并且相当直观。
默认进度条打印有 # 符号。我们还可以将进度条打印为旋转器,就像网络浏览器中显示的加载圆圈一样。
与 tqdm 类似,它可以包裹在可迭代对象中,也可以与上下文管理器一起使用。
如果您想将打印功能与进度条一起使用,则每次打印功能后都会在输出屏幕上显示一个新的进度条,因此会显示极其混乱的输出。
为了避免这种情况,progressbar2可以使用库。它允许标准重定向到输出,允许干净的进度条以及打印功能。

这里提到的最后一个替代方案是alive-progress库提供了一些看起来最酷的进度条选项。
如果您的项目需要动画进度条或交互式进度条,那么alive-progress将是最适合您的。

 

全面质量管理的优点

tqdm 进度条相对于其替代方案的主要优势之一是其速度。
相比之下,tqdm bar 每次迭代的开销为 60nsprogressbar每次迭代的开销为 800ns。
tqdm bar还有其他优点,例如它不仅可以与jupyter笔记本一起使用,还可以与流行的Python框架(例如Keras、Dask等)一起使用。
还提供根据项目要求与 Discord、Slack 和 Telegram 进行自定义集成的选项。

 

结论

进度条具有多种优点,例如:

  1. 目视估计任务进度
  2. 完成任务所需的时间估计
  3. 程序中存在问题或错误的指示。

tqdm 栏是一个低开销的智能进度栏,您可以在项目中利用它提供的多种自定义功能。
本文中提到了其中一些,您可以参考以下文档:https://github.com/tqdm/tqdm以获得更详细的文档。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 tqdm 创建 Python 终端进度条? 的相关文章

随机推荐

  • 如何利用技术进步实现完美的远程办公

    远程工作并不是一个新趋势 作家 记者和艺术家总是有机会在舒适的家中工作 尽管如此 远程办公始终与技术密切相关 在过去 远程工作人员依赖邮件服务和交通 随着这两个领域变得越来越好 越来越多的人能够在家执行工作任务 然而 直到互联网的出现 这种
  • 如何在 Debian 9 上设置 Apache 虚拟主机

    在本教程中 我们将引导您了解如何在 Debian 9 上设置 Apache 虚拟主机 Apache 虚拟主机允许您在一台计算机上托管多个域 使用虚拟主机时 您可以为每个域或子域指定不同的文档根 包含网站文件的目录 创建单独的安全策略 使用不
  • 如何在 CentOS 8 上安装 R

    R 是一种开源编程语言和免费环境 专门从事统计计算和图形表示 它由 R 统计计算基金会支持 主要供统计学家和数据挖掘人员用于开发统计软件和执行数据分析 本文介绍如何在 CentOS 8 上安装 R 先决条件 在继续本教程之前 请确保您已满足
  • 如何更改 SFTP 端口

    SFTP SSH 文件传输协议 是一种安全文件协议 用于通过加密连接在两台主机之间传输文件 它还允许您对远程文件执行各种文件操作并恢复文件传输 SFTP 可用作旧版 FTP 协议的替代品 它具有 FTP 的所有功能 但连接更安全 本文介绍如
  • 如何在 Ubuntu 18.04 上设置或更改时区

    在 Ubuntu 上 系统的时区是在安装过程中设置的 但以后可以轻松更改 使用正确的时区对于许多与系统相关的任务和流程都很重要 例如 cron 守护进程使用系统的时区来执行 cron 作业 并且日志文件中的时间戳基于相同的时区 本教程演示如
  • 如何在 Debian 9 上安装 Yarn

    Yarn 是一个与 npm 兼容的 JavaScript 包管理器 它的创建是为了解决 npm 的一系列问题 例如通过并行操作加快软件包安装过程并减少与网络连接相关的错误 在本教程中 我们将指导您如何安装Yarn在 Debian 9 系统上
  • 如何在 Ubuntu 18.04 上安装 Django

    Django 是一个免费开源的高级 Python Web 框架 旨在帮助开发人员构建安全 可扩展和可维护的 Web 应用程序 有不同的方法来安装 Django 具体取决于您的需要 它可以在系统范围内安装 也可以使用 pip 安装在 Pyth
  • 如何在 Linux 中添加目录到 PATH

    当您在命令行上键入命令时 您基本上是在告诉 shell 运行具有给定名称的可执行文件 在Linux中 这些可执行程序就像ls find file和其他文件 通常位于系统上的几个不同目录中 存储在这些目录中的任何具有可执行权限的文件都可以从任
  • 如何在 CentOS 8 上设置或更改时区

    使用正确的时区对于许多与系统相关的任务和流程至关重要 例如 cron 守护进程使用系统的时区来执行 cron 作业 并且日志文件中的时间戳基于同一系统的时区 在 CentOS 上 系统的时区是在安装过程中设置的 但以后可以轻松更改 本文介绍
  • Python range() 函数

    蟒蛇rangetype 通过定义范围的起点和终点来生成整数序列 它通常与for循环迭代数字序列 range 在 Python 2 和 3 中的工作方式有所不同 在Python 2中 有两个函数可以让你生成整数序列 range and xra
  • Linux 中的正常运行时间命令

    在本教程中 我们将介绍uptime命令 顾名思义 uptime命令显示系统已经运行了多长时间 它还显示当前时间 登录用户数以及过去 1 5 和 15 分钟的系统负载平均值 如何使用正常运行时间命令 uptime 命令的语法如下 uptime
  • 如何在 CentOS 7 上使用 VSFTPD 设置 FTP 服务器

    FTP 文件传输协议 是一种标准的客户端 服务器网络协议 允许用户在远程网络之间传输文件 有多种可用于 Linux 的开源 FTP 服务器 最流行和最广泛使用的是PureFTPd ProFTPD and vsftpd 在本教程中 我们将在
  • Python while 循环

    循环是编程语言的基本概念之一 当您想要多次重复特定的代码块直到满足给定条件时 循环会很方便 Python中有两种基本的循环结构 for and while loops 本教程涵盖了以下基础知识whilePython 中的循环 我们还将向您展
  • NumPy loadtxt 教程(从文件加载数据)

    在之前的教程中 我们讨论过NumPy 数组 我们看到了它如何使读取 解析和对数字数据执行操作的过程变得轻而易举 在本教程中 我们将讨论 NumPy loadtxt 方法 该方法用于解析文本文件中的数据并将其存储在 n 维 NumPy 数组中
  • Linux Bash 脚本编写第 3 部分 – 参数和选项

    到目前为止 您已经了解了如何编写无需用户输入即可完成工作的 Linux bash 脚本 今天我们将继续我们的 Linux bash 脚本系列 如果您想了解我们在谈论什么 我建议您查看之前的帖子 Bash 脚本基础知识 Bash 脚本 For
  • Pythonnamedtuple(将元组提升到一个新的水平)

    在本教程中 我们将深入研究命名元组 它们是什么 如何创建和操作它们 以及何时使用它们 或不使用它们 命名元组是Python内置的一部分收藏模块 并且它们提供了一种将数据捆绑在一个名称下的便捷方法 它们是 Python 内置元组数据类型的子类
  • 使用 Python 处理 CSV:综合教程

    CSV 逗号分隔值 文件是存储和共享表格数据的最常见方法之一 这些文件由行和列组成 其中每行代表一个记录 列包含由分隔符 通常是逗号 分隔的值 Python 提供了多种内置方法来处理 CSV 文件 使您可以高效地读取 写入和操作数据 本教程
  • Linux Bash 脚本编写第 5 部分 – 信号和作业

    在上一篇文章中 我们谈到了输入 输出和重定向在 bash 脚本中 今天我们将学习如何在Linux系统上运行和控制它们 到目前为止 我们只能从命令行界面运行脚本 但这并不是运行 Linux bash 脚本的唯一方法 这篇文章描述了控制 Lin
  • 使用curl命令的SSL/TLS:安全连接指南

    卷曲命令是一种发出网络请求的工具 它在通过 HTTPS 与安全服务器通信时使用 SSL TLS 默认情况下 curl尝试在可用时使用安全连接 但了解如何控制和诊断这些连接至关重要 目录 hide 1 使用客户端证书 2 指定证书类型 3 使
  • 如何使用 tqdm 创建 Python 终端进度条?

    进度条是估算和显示任务所需时间的宝贵工具 这些也可以添加到您的 Python 脚本或代码块中 以指示代码执行所需的时间 Python 中有多种可用的库 例如progressbar and tqdm可以用于此目的 目录 hide 1 什么是