进度条是估算和显示任务所需时间的宝贵工具。
这些也可以添加到您的 Python 脚本或代码块中,以指示代码执行所需的时间。
Python 中有多种可用的库,例如progressbar
and tqdm
可以用于此目的。
什么是 tqdm?
tqdm
是一个 Python 库,它提供了包装指定迭代的函数,以提供智能进度条作为输出。
Python 是一种广泛使用的语言,用于执行长时间运行的计算密集型任务。
A 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:
一段时间后,我们看到多个条,每个条对应一个内部循环,
而只有一个进度条显示外循环的进度
请注意,在上面的代码中,我们使用了trange
tqdm 库中的函数。
此函数可替代使用 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 之外,还可以使用其他几个库来实现相同或相似的目标。
其中一些库是progressbar
, progressbar2
, and alive-progress
.
progressbar
是一个简单的库并且相当直观。
默认进度条打印有 # 符号。我们还可以将进度条打印为旋转器,就像网络浏览器中显示的加载圆圈一样。
与 tqdm 类似,它可以包裹在可迭代对象中,也可以与上下文管理器一起使用。
如果您想将打印功能与进度条一起使用,则每次打印功能后都会在输出屏幕上显示一个新的进度条,因此会显示极其混乱的输出。
为了避免这种情况,progressbar2
可以使用库。它允许标准重定向到输出,允许干净的进度条以及打印功能。
这里提到的最后一个替代方案是alive-progress
库提供了一些看起来最酷的进度条选项。
如果您的项目需要动画进度条或交互式进度条,那么alive-progress
将是最适合您的。
全面质量管理的优点
tqdm 进度条相对于其替代方案的主要优势之一是其速度。
相比之下,tqdm bar 每次迭代的开销为 60nsprogressbar
每次迭代的开销为 800ns。
tqdm bar还有其他优点,例如它不仅可以与jupyter笔记本一起使用,还可以与流行的Python框架(例如Keras、Dask等)一起使用。
还提供根据项目要求与 Discord、Slack 和 Telegram 进行自定义集成的选项。
结论
进度条具有多种优点,例如:
- 目视估计任务进度
- 完成任务所需的时间估计
- 程序中存在问题或错误的指示。
tqdm 栏是一个低开销的智能进度栏,您可以在项目中利用它提供的多种自定义功能。
本文中提到了其中一些,您可以参考以下文档:https://github.com/tqdm/tqdm以获得更详细的文档。