首页Python【Python计算生态】t...

【Python计算生态】tqdm——进度条库

Python受欢迎的原因之一就是其计算生态丰富,据不完全统计,Python 目前为止有约13万+的第三方库。

本系列将会陆续整理分享一些有趣、有用的第三方库。

文章配套代码获取有以下两种途径:
  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/1FSGLd7aI_UQlCQuovVHc_Q?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/Python_Ecosystem





01
简介

tqdm是一个快速、可扩展的Python进度条工具,可用于Python和命令行界面(CLI)。它能够为循环、文件操作等任务提供直观的进度反馈,帮助开发者在执行耗时任务时,为用户提供直观的进度反馈。
  • 进度条显示:tqdm可以自动为循环、文件读写等操作生成进度条,显示当前进度、剩余时间、已完成的任务数等信息。
  • 高度自定义:用户可以自定义进度条的样式、颜色、格式等。
  • 支持多种场景:适用于循环、文件处理、数据加载等场景,也可以与 pandas等库结合使用。
  • 多线程和多进程支持:在多线程或多进程环境中,tqdm可以正确显示每个线程或进程的进度。
直接使用pip安装:
pip install tqdm
GitHub页面:
https://github.com/tqdm/tqdm

02
使用

  • 2.1 基于可迭代对象:
tqdm对象可以通过tqdm()函数创建,tqdm的基本使用非常简单,只需要将可迭代对象(如列表、范围等)包装在tqdm函数中即可,将返回一个与原始可迭代对象完全相同的迭代器,但会在每次请求值时打印一个动态更新的进度条。
from tqdm import tqdm
import time

# 创建一个范围对象
numbers = range(10)

# 使用 tqdm 包装范围对象
for i in tqdm(numbers):
    # 模拟耗时操作
    time.sleep(0.1)
# 使用 tqdm 包装列表对象
for char in tqdm(["a""b""c""d"]):
    # 模拟耗时操作
    time.sleep(0.1)
trange(i)是 tqdm(range(i)) 的一个特殊优化实例:
from tqdm import trange

for i in trange(100):
    sleep(0.1)
tqdm 可以与其他迭代器(如 enumerate、zip 等)结合使用。
例如,下面的示例中,使用enumerate函数对列表data进行枚举,并使用tqdm包装,同时设置总进度为列表的长度。
data = ['a''b''c''d''e']
for index, item in tqdm(enumerate(data), total=len(data)):
    print(f'Index: {index}, Item: {item}')
    # 模拟耗时操作
    time.sleep(1)

  • 2.2 手动控制:
除了包装迭代器,还可以手动创建和更新进度条。
手动控制tqdm()更新,需要使用with语句。
# total 参数用于指定迭代的总次数或任务的总量
with tqdm(total=200) as pbar:
    for i in range(10):
        time.sleep(0.1)
        pbar.update(10)
不过with语句是可选的,也可以直接将tqdm()赋值给一个变量,但这种情况下不要忘记在最后调用delclose()
# 创建一个 tqdm 实例,total 参数设置为 200,表示总共有 200 步
pbar = tqdm(total=200)
for i in range(10):
    time.sleep(0.1)
    # 更新进度条,每次更新 10 步
    pbar.update(10)
# 关闭进度条
pbar.close()

  • 2.3 自定义描述和额外统计信息:
tqdm()函数具有以下参数,用于添加自定义描述和额外统计信息:
  • iterable:可迭代对象,用于装饰进度条。如果为空,则需要手动管理更新。
  • desc:进度条前缀。
  • total:预期迭代次数。如果未指定,将尝试使用 len(iterable)。如果为 float(“inf”) 或无法获取长度,则仅显示基本进度统计信息(无 ETA 和进度条)。
  • leave:是否在迭代结束后保留进度条。
  • file:指定进度条输出的目标文件。默认为 sys.stderr
  • ncols:整个输出消息的宽度。如果未指定,将尝试使用环境宽度。如果为 0,则不显示进度条(仅显示统计信息)。
  • mininterval:进度条显示更新的最小间隔时间(秒)。
  • maxinterval:进度条显示更新的最大间隔时间(秒)。如果启用监控线程或动态调整 miniters,则会自动调整 miniters 以适应 mininterval
  • miniters:进度条显示更新的最小间隔迭代次数。如果为 0 且启用 dynamic_miniters,则会自动调整为与 mininterval 对应的迭代次数。
  • ascii:是否使用 ASCII 字符显示进度条。如果未指定或为 False,则使用 Unicode 字符。
  • disable:是否禁用进度条。如果为 None,则在非 TTY 环境中禁用。
  • unit:每次迭代的单位。
  • unit_scale:是否自动缩放迭代次数并添加国际单位制前缀(如千、兆等)。
  • dynamic_ncols:是否动态调整 ncols 和 nrows 以适应窗口大小变化。
  • smoothing:用于速度估计的指数移动平均平滑因子。
  • bar_format:自定义进度条格式字符串。
  • initial:初始计数器值。适用于重新启动进度条。
  • position:指定进度条显示的行偏移量(从 0 开始)。如果未指定,则自动确定。
  • postfix:指定额外的统计信息,显示在进度条末尾。
  • unit_divisor:单位缩放的分母(默认为 1000)。
  • write_bytes:是否以字节形式写入。如果为 False,则写入 Unicode
  • lock_args:传递给 refresh 的参数,用于中间输出。
  • nrows:屏幕高度。如果未指定,则尝试使用环境高度。
  • colour:进度条颜色。
  • delay:在显示进度条之前延迟的时间(秒)。
以下是一个使用多个常用参数的示例代码,创建一个带有描述、单位、动态宽度调整和额外统计信息的进度条:
# 创建一个 tqdm 对象,使用多个常用参数
for i in tqdm(
    range(100),
    desc="Processing",  # 设置描述
    unit="item",        # 设置单位
    unit_scale=True,    # 自动缩放单位
    dynamic_ncols=True, # 动态调整宽度
    postfix={"loss": 0.5, "accuracy": 0.9},  # 设置额外统计信息
    colour="green"# 设置颜色
):
    time.sleep(0.01)  # 模拟耗时操作

  • 2.4 动态更新描述信息:
可以在进度条更新时动态更新描述信息。
tqdm 库中,set_descriptionset_postfix是两个非常实用的方法,用于在进度条上动态显示额外的信息,更好地监控和理解程序的运行状态。
set_description方法用于设置进度条左侧的描述信息,该信息会随着进度条一起显示,并且可以在循环过程中动态更新,让你能够实时展示当前任务的相关信息。
pbar.set_description(desc=None, refresh=True)
参数说明:
  • desc:要设置的描述信息,类型为字符串。如果为 None,则清除描述信息。
  • refresh:是否立即刷新进度条,默认为 True
set_postfix方法用于在进度条右侧显示额外的信息,通常用于展示一些与当前任务相关的统计数据,如损失值、准确率等。这些信息会以键值对的形式显示,并且可以在循环过程中动态更新。
pbar.set_postfix(ordered_dict=None, refresh=True, **kwargs)
参数说明:
  • ordered_dict一个有序字典,用于指定要显示的键值对信息。
  • refresh:是否立即刷新进度条,默认为 True
  • **kwargs:可变关键字参数,用于指定要显示的键值对信息。
在下述代码中,在每次循环中使用set_description方法更新进度条的描述信息,显示当前正在处理的项目编号。在每次循环中计算一个结果,然后使用set_postfix方法将结果以键值对的形式显示在进度条右侧。
# 创建一个进度条实例
pbar = tqdm(range(10))
for i in pbar:
    # 动态更新描述信息
    pbar.set_description(f"Processing item {i}")
    
    # 模拟一个计算结果
    result = i * 2
    # 动态更新进度条右侧的信息
    pbar.set_postfix({"Result": result})
    time.sleep(0.5)
# 关闭进度条
pbar.close()
  • 2.5 嵌套进度条:
tqdm支持嵌套循环,可以在循环中嵌套使用tqdm来显示多层进度条。
for i in tqdm(range(3), desc='外层循环'):
    for j in tqdm(range(3), desc='内层循环', leave=False, ncols=40):
        time.sleep(0.1)

  • 2.6 与 Pandas 集成:

Pandas中使用tqdm的基本方法是通过tqdm.pandas()函数将tqdm与 Pandas集成,然后使用progress_applyprogress_map方法来显示进度条。

import pandas as pd
from tqdm import tqdm
import time

# 创建一个示例 DataFrame
df = pd.DataFrame({'a': range(10)})

# 使用 tqdm 进度条
# 可以通过 tqdm 的参数来自定义进度条的外观和行为
tqdm.pandas(desc='正在处理数据记录', colour="green")

def apply_fun(x):
    time.sleep(2)  # 模拟耗时操作
    return x ** 2

# 使用 progress_map 显示进度条
df['a_squared'] = df['a'].progress_apply(apply_fun)


  • 2.7 与 IPython/Jupyter Notebook 集成:

tqdmIPythonJupyter Notebook很好地集成,以在这些环境中提供美观且交互性强的进度条。

首先要确保已经安装了Jupyter Notebook中用于显示交互式小部件的库ipywidgetstqdmJupyter Notebook中显示进度条依赖于它。可以使用以下命令进行安装:

pip install ipywidgets# Anaconda 环境conda install -c conda-forge tqdm ipywidgets

Jupyter Notebook中,需要使用tqdm.notebook模块中的trangetqdm函数,它们会以更美观的方式显示进度条。

from tqdm.notebook import trange, tqdm

for i in trange(3, desc='1st loop'):
    for j in tqdm(range(100), desc='2nd loop'):
        time.sleep(0.01)


更多内容可以前往官方文档查看:

https://tqdm.github.io/

本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments