Python 如何创建和使用进度条(tqdm模块)

news2024/12/23 8:49:57

在处理大规模数据、运行长时间任务或者需要跟踪任务进度的场景中,进度条(Progress Bar)是非常有用的工具。Python 的 tqdm 模块提供了一种简便的方法来创建和使用进度条,它的名称来源于阿拉伯语词汇“taqaddum”,意思是“进步”。

tqdm 模块非常流行,它既可以用在命令行界面,也可以嵌入在 Jupyter Notebook 等环境中。它支持循环、文件处理、函数装饰器等多种场景。接下来,我们将详细讲解如何安装 tqdm,如何在不同的场景下创建和使用进度条,并探讨一些高级用法。

2. tqdm 模块的安装

在开始使用 tqdm 之前,需要先确保该模块已经安装。可以使用以下命令进行安装:

pip install tqdm

安装完成后,就可以在 Python 脚本或交互式环境中使用 tqdm 了。

3. 基础用法

3.1 简单的循环进度条

最常见的场景是为一个循环(例如 for 循环)添加进度条。我们只需将 tqdm 包裹在迭代对象上即可:

from tqdm import tqdm
import time

for i in tqdm(range(100)):
    time.sleep(0.1)  # 模拟一些耗时操作

运行这个代码时,你会在命令行或终端中看到一个动态更新的进度条:

  0%|          | 0/100 [00:00<?, ?it/s]
 50%|█████     | 50/100 [00:05<00:05,  9.96it/s]
100%|██████████| 100/100 [00:10<00:00,  9.97it/s]

其中:

  • 0%100% 表示当前进度百分比。
  • | | 是一个视觉上的进度条。
  • 50/100 表示已完成 50 个迭代,总共 100 个迭代。
  • [00:05<00:05, 9.96it/s] 表示已经运行了 5 秒,预计剩余 5 秒,速度为 9.96 次/秒。
3.2 自定义进度条描述

可以通过 desc 参数为进度条添加描述信息,帮助用户更好地理解当前进度条的任务:

for i in tqdm(range(100), desc="Processing"):
    time.sleep(0.1)

这会在进度条前加上 Processing 文字,使输出更有意义。

4. 进阶用法

4.1 嵌套进度条

在处理嵌套循环时,可以使用多个进度条,tqdm 支持这种场景:

for i in tqdm(range(10), desc="Outer Loop"):
    for j in tqdm(range(100), desc="Inner Loop", leave=False):
        time.sleep(0.01)

这里,我们在外层循环和内层循环中都使用了 tqdmleave=False 参数用于控制内层进度条在完成后是否保留。如果设置为 False,进度条完成后会被清除,以保持输出的简洁性。

4.2 手动更新进度条

有时你可能不会使用一个明确的循环,但仍然需要显示进度条。在这种情况下,你可以手动控制进度条的更新。

from tqdm import tqdm
import time

with tqdm(total=100) as pbar:
    for i in range(10):
        time.sleep(0.5)
        pbar.update(10)

pbar.update(10) 会将进度条推进 10 个单位,总共需要推进到 100。

4.3 与 enumerate 结合

当你需要同时获取索引和元素时,通常会使用 enumerate 函数。tqdm 同样支持与 enumerate 结合使用:

for i, item in enumerate(tqdm(range(100))):
    time.sleep(0.1)

这使得你可以在循环中轻松地跟踪进度,并同时获得索引。

4.4 与 pandas 结合

如果你在处理大型数据集,尤其是使用 pandas 进行数据处理时,tqdm 也能很好地与 pandas 结合。你可以在 apply 函数中添加进度条:

import pandas as pd
from tqdm import tqdm

tqdm.pandas()

df = pd.DataFrame({'a': range(1000)})
df['b'] = df['a'].progress_apply(lambda x: x**2)

通过 tqdm.pandas(),你可以在 pandasapplymapapplymap 等函数中自动添加进度条。

4.5 文件处理进度条

在处理文件时(如读取大文件、下载文件等),tqdm 也可以显示文件处理进度:

from tqdm import tqdm

# 假设你有一个大文件需要逐行读取
with open('large_file.txt', 'r') as f:
    for line in tqdm(f, total=1000000):
        pass  # 处理每一行数据

这里,我们假设文件有 100 万行,通过 tqdm 可以实时监控文件读取的进度。

5. 高级用法

5.1 自定义进度条格式

tqdm 允许你自定义进度条的显示格式。你可以使用 bar_format 参数来控制进度条的外观:

for i in tqdm(range(100), bar_format="{l_bar}{bar}| {n_fmt}/{total_fmt} [{elapsed}<{remaining}, {rate_fmt}{postfix}]"):
    time.sleep(0.1)

在上面的代码中:

  • {l_bar} 包含 desc 和百分比。
  • {bar} 是进度条本身。
  • {n_fmt}/{total_fmt} 显示当前迭代数和总迭代数。
  • {elapsed} 是已经耗费的时间。
  • {remaining} 是预计的剩余时间。
  • {rate_fmt} 是处理速率。

可以根据需求添加或移除这些参数,甚至可以自定义一些新的变量。

5.2 使用装饰器

tqdm 提供了装饰器,用于装饰函数,从而自动为函数调用生成进度条:

from tqdm import tqdm
import time

@tqdm
def my_function():
    for _ in range(100):
        time.sleep(0.1)

my_function()

这样,你可以很方便地为函数添加进度条,而无需显式地在函数内部调用 tqdm

5.3 GUI 环境中的进度条

如果你是在一个图形用户界面(如 PyQt 或 Tkinter)中工作,而不是命令行,tqdm 也有解决方案。使用 tqdm.gui.tqdm 可以在 GUI 环境中创建进度条。

from tqdm.gui import tqdm
import time

for i in tqdm(range(100)):
    time.sleep(0.1)

tqdm.gui 会自动识别是否运行在 GUI 环境中,并根据环境显示合适的进度条。

5.4 多线程和多进程的进度条

在处理多线程或多进程任务时,tqdm 也支持显示多个任务的进度条。tqdm 通过支持 concurrent.futuresmultiprocessing 模块来处理并发任务。

from tqdm import tqdm
from concurrent.futures import ThreadPoolExecutor
import time

def task(n):
    time.sleep(n)

with ThreadPoolExecutor(max_workers=10) as executor:
    list(tqdm(executor.map(task, range(10)), total=10))

上面的代码示例使用了 ThreadPoolExecutor 来创建多线程任务,并通过 tqdm 显示每个线程的进度。

5.5 使用 tqdm 处理异步任务

tqdm 也可以与 asyncio 一起使用来处理异步任务。通过 tqdm_asyncio.tqdm_asyncio,你可以轻松地在异步函数中添加进度条。

import asyncio
from tqdm.asyncio import tqdm_asyncio

async def async_task():
    await asyncio.sleep(1)

async def main():
    tasks = [async_task() for _ in range(10)]
    for _ in tqdm_asyncio.as_completed(tasks):
        pass

asyncio.run(main())

这里,tqdm_asyncio.as_completed 可以与 asyncio.as_completed 结合,显示异步任务的进度。

6. 常见问题和优化

6.1 tqdm 与其他库冲突

在某些情况下,tqdm 可能与某些库的输出系统发生冲突,导致进度条显示不正常。例如,logging 模块的输出可能会破坏 tqdm 的进度条。为了解决这个问题,可以将 tqdmwrite 函数与 logging 结合:

import logging
from tqdm import tqdm

logging.basicConfig(level=logging.INFO)
for i in tqdm(range(100)):
    logging.info("Logging info")

这样,tqdm 会自动处理 logging 的输出,保证进度条的显示不会受到影响。

6.2 性能优化

tqdm 的性能非常好,通常不会成为程序的瓶颈。但如果在非常高频率的更新操作中,进度条的刷新可能会对性能产生一定影响。为了优化性能,可以降低进度条的刷新频率:

for i in tqdm(range(10000), mininterval=1.0):
    time.sleep(0.001)

这里,mininterval=1.0 表示进度条最少每 1 秒刷新一次,而不是每次更新都刷新。

tqdm 是一个强大且易于使用的 Python 库,能够帮助开发者在处理长时间任务时轻松地添加进度条。无论是在简单的循环、复杂的嵌套循环、多线程或异步任务中,tqdm 都提供了丰富的功能来显示进度。此外,它还支持与 pandasasyncio 等流行库结合,能够适应各种场景下的需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2097063.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【方法分享】如何使用WinRAR将文件夹里的每个文件压缩

不知道大家是否会遇到这种情况&#xff0c;将文件夹内的多个文件或文件夹压缩成一个个压缩包文件&#xff0c;这种情况除了将文件夹中的文件一个个压缩&#xff0c;还有什么批量操作的方法呢&#xff1f;今天分享使用WinRAR批量压缩文件到每个单独的文件夹的方法。 方法如下&a…

问题-解决方案对-《分析模式》漫谈24

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 “Analysis Patterns”的第一章有这么一句&#xff1a; It is an important form because it supports the definition of a pattern as "a solution to a problem in context,&…

constexpr关键字

1.const 在c11之前只有const关键字&#xff0c;主要有两个作用&#xff1a;变量只读&#xff0c;修饰常量。 2.constexpr 在c11中新添加了关键字constexpr(作用&#xff1a;用于修饰常量表达式) 常量表达式&#xff1a;由多个常量组成并在编译过程中就能得到计算结果的表达…

React16新手教程记录

文章目录 前言一些前端面试题1. 搭建项目1. 1 cdn1. 2 脚手架 2. 基础用法2.1 表达式和js语句区别&#xff1a;2.2 jsx2.3 循环map2.4 函数式组件2.5 类式组件2.6 类组件点击事件2.6.1 事件回调函数this指向2.6.2 this解决方案2.6.2.1 通过bind2.6.2.2 箭头函数&#xff08;推荐…

MySQL数据库增删查改(基础)CRUD

CRUD 即增加 (Create) 、查询 (Retrieve) 、更新 (Update) 、删除 (Delete) 四个单词的首字母缩写。 1. 新增&#xff08;Create&#xff09; 1.1单行数据&#xff08;全列插入&#xff09; 比如说&#xff1a;创建一张学生表&#xff0c;有姓名&#xff0c;学号。插入两个学…

C++和OpenGL实现3D游戏编程【连载7】——文字和汉字的显示

1、本节实现的内容 上一节我们讨论了纹理在二维平面内不规则图形贴图的相关基础操作,本节我们开始了解游戏里文字以及汉字的显示方法。本节课我们将从基本的ASCII字符显示,拓展到中文字符的显示,最后再讲到纹理字符的显示,并对各种文字显示方法的优缺点和使用场景进行分析…

改进YOLO的群养猪行为识别算法研究及部署(小程序-网站平台-pyqt)

概述 群养猪的运动信息和行为信息与其健康状况息息相关&#xff0c;但人工巡视费时费力&#xff0c;本实验提出采用行为识别算法于群养猪的养殖管理中&#xff0c;识别群养猪drink&#xff08;饮水&#xff09;、stand&#xff08;站立&#xff09;和lie&#xff08;躺卧&#…

[STM32]从零开始的STM32标准库环境搭建(小白向)

一、我们为什么要搭建STM32标准库开发环境 如果你对STM32有一定的了解&#xff0c;相信你已经认识了STM32的几种开发方式。基于STM32寄存器开发&#xff0c;基于ST官方的标准库开发&#xff0c;基于ST官方的HAL库开发。我们现在来了解一下这些库的优缺点。首先就是基于寄存器开…

【计算机组成原理】七、输入/输出系统:1.I/O基本概念、I/O设备(外部设备)

七、输入/输出系统 文章目录 七、输入/输出系统1.基本概念4. I/O设备&#xff08;外部设备&#xff09;4.1输出设备4.1.1键盘4.1.2鼠标 4.2输出设备4.2.1显示器4.2.2打印机 4.3外存设备 1.基本概念 “I/O”就是“输入/输出”( Input/Output)。 I/O系统由I/O软件和I/O硬件两部分…

精益管理:怎样选择适合的库存管理策略?

如果顾客在下单后愿意耐心等待产品制作完成&#xff0c;对于生产管理者而言&#xff0c;自然是最为方便的。一般而言&#xff0c;水电工程行承接的订单&#xff0c;顾客都只能耐心等待工作完成&#xff1b;但这只是个别情况&#xff0c;实际上大部分顾客并没有这么多耐心&#…

【k8s系列】Kubernetes Service 深度解析:从基础到实战

一、前言 在当今的云原生世界中&#xff0c;Kubernetes 已经成为容器编排和管理的事实标准。它提供了一种强大的方式来部署、扩展和管理容器化应用。然而&#xff0c;随着应用规模的扩大和复杂性的增加&#xff0c;如何有效地暴露和管理这些应用的网络服务成为了一个关键问题。…

Google Gemini 使用 | 中小型企业借助谷歌 Gemini 提高生产力的 5 种方法

Gemini Business for Workspace 融合了谷歌最强 AI 技术&#xff0c;并集成到办公产品组件中的解决方案。 无论是中型的家族企业&#xff0c;还是刚起步的小型创业团队&#xff0c;你们是否觉得一天 24 小时根本不够用&#xff1f;既要忙着客户维系和拉新&#xff0c;又要管理员…

pda移动护理终端医用手持机

随着物联网技术的发展&#xff0c;智能设备之间形成了紧密的网络互联。 医疗行业越来越注重智能设备的使用&#xff0c;医用手持机可以采集病人、药品、材料等信息&#xff0c;很大程度地改善了医院患者的管理&#xff0c;进一步提升医护人员的工作效率。 医护人员通过使用pda移…

【开学季】告别一次性AI写作工具,打造你自己的专属AI助手!

新学期的钟声敲响&#xff0c;校园里充满了书本的香气和求知的热情。&#x1f4da;可许多学生和职场人士&#xff0c;仍然依赖那些一次性的AI写作工具来完成自己的写作任务。我想问你&#xff1a;为什么不尝试自己构建一个属于自己的AI写作工作流呢&#xff1f;&#x1f914; 前…

机器学习:自然语言处理之关键词提取(TF-IDF)

目录 前言 一、TF-IDF 1.TF 2.IDF 3.TF-IDF计算法则 4.TF-IDF的本质 二、代码实现 1.导入库 2.读取文本数据 3. 初始化TfidfVectorizer并转换文本数据 4. 获取词汇表并创建 DataFrame 5.处理每篇文章的特征 总结 前言 TF-IDF&#xff08;Term Frequency-Inverse D…

MySql字段有null值与其他值的比较

MySql字段有null值与其他值的比较 SELECT count(1)在这里插入代码片FROM LAW_ENFORCEMENT_TROUBLE TBWHERE TB.STATUS 1AND TB.DUTY_LIMIT_DATE < NOW()AND TB.TROUBLE_STATUS ! 2查出结果为0条&#xff0c;但是应该为3条&#xff0c;查看表数据发现&#xff0c;TROUBLE_S…

常见图像图片属性的介绍与说明

图像属性是指图像的一些基本特征和参数&#xff0c;它们定义了图像的外观和存储方式。以下是一些常见的图像属性&#xff1a; 1. 分辨率&#xff1a; 分辨率通常以像素数&#xff08;如800x600&#xff09;来表示&#xff0c;指的是图像的宽度和高度上的像素点数。分辨率越高&…

mysql5.7 TIMESTAMP NOT NULL DEFAULT ‘0000-00-00 00:00:00‘ 换版8版本 引发的问题

mysql5.7 TIMESTAMP NOT NULL DEFAULT 0000-00-00 00:00:00 换版引发的问题 问题背景sql_mode上机演示5.78.4 问题背景 在项目mysql版本由5.7 换版到8.4版本后&#xff0c;我们进行回归测试时&#xff0c;却发现一个积年代码报错了&#xff0c;是数据库插入报的错 xxx can not…

自用Office 365家庭版全家桶 + OneDrive 1TB拼车,40/年,来长期拼的!

自用Office 365家庭版全家桶 OneDrive 1TB拼车&#xff0c;40/年&#xff0c;来长期拼的! &#x1f50d;1.背景描述&#x1f50d;&#x1f421;2. 常见问题解答&#x1f421;【问】是正版吗&#xff1f;【问】跟普通版本有什么区别&#xff1f;【问】会不会是假货? &#x1f…

1、Java简介+DOS命令+java的编译运行(字节码/机器码、JRE/JVM/JDK/JIT的区别)+一个简单的Java程序

前言&#xff1a;本文属于黑马程序员和javaguide的混合笔记&#xff0c;仅作学习分享使用&#xff0c;建议感兴趣的小伙伴去看黑马原视频或javaguide原文。如有侵权&#xff0c;请联系删除。 Java类型&#xff1a; JavaSE 标准版&#xff1a;以前称为J2SE&#xff0c;主要用来…