Python中tqdm进度条工具和enumerate函数的使用详解

news2025/5/25 23:19:22

tqdm进度条工具

tqdm 是 Python 中一个非常流行的 进度条显示工具库,常用于迭代操作的可视化,比如训练神经网络、批量数据处理等任务。


一、tqdm 是什么?

tqdm 全称是 taqaddum(阿拉伯语,意为“进展”),它会在控制台输出一个带进度条的实时反馈,常用于 for 循环中追踪当前执行状态和速度。


二、常用方法

1. 对普通 for 循环添加进度条

from tqdm import tqdm
for i in tqdm(range(100)):
    # 模拟耗时任务
    time.sleep(0.01)

2. 与 DataLoader 搭配(最常见)

from tqdm import tqdm
for batch in tqdm(trainloader):
    # 处理 batch
    pass

3. 自定义描述信息

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

4. 显示时间与速率信息

tqdm 会自动显示:

  • 当前进度
  • 已耗时间
  • 平均耗时
  • 预计剩余时间

例如:

Processing:  45%|██████████████████▋                | 45/100 [00:01<00:01, 34.56it/s]

5. 嵌套进度条(多层循环)

from tqdm import tqdm
for i in tqdm(range(3), desc="Outer loop"):
    for j in tqdm(range(100), desc="Inner loop", leave=False):
        time.sleep(0.01)

三、使用注意事项

问题建议
卡住无响应?避免在 Jupyter 中用旧版本 tqdm,使用 tqdm.notebook 替代
速度不准?小任务迭代速度快可能导致显示误差大,可加 mininterval=0.5
配合 DataLoader 卡顿?添加 num_workers=0 测试排查线程冲突
重定向被清空?若与 print() 频繁混用建议设 tqdm(..., leave=True)

四、完整代码示例

from tqdm import tqdm
import time

print("普通进度条演示:")
for i in tqdm(range(50), desc="任务A"):
    time.sleep(0.02)

print("\n嵌套进度条演示:")
for epoch in tqdm(range(2), desc="Epoch"):
    for batch in tqdm(range(10), desc="Batch", leave=False):
        time.sleep(0.05)

五、进阶用法(如更新、写日志)

from tqdm import tqdm
import time

pbar = tqdm(total=100)
for i in range(10):
    time.sleep(0.1)
    pbar.update(10)
pbar.close()

六、安装

pip install tqdm

在 Jupyter Notebook 中建议使用:

from tqdm.notebook import tqdm

enumerate函数

enumerate 是 Python 的一个内建函数,用于在遍历可迭代对象(如列表、元组等)时,同时获得元素的索引和值。相比使用传统的 range(len(x)) 方式,enumerate 更简洁、可读性更强,是写 Pythonic 代码的重要工具。


一、基本语法

enumerate(iterable, start=0)
参数说明
iterable可迭代对象(如列表、字符串、元组、集合、字典等)
start起始索引,默认是 0,也可以设定为任意整数

二、基本示例

fruits = ["apple", "banana", "cherry"]

for index, fruit in enumerate(fruits):
    print(index, fruit)

输出:

0 apple
1 banana
2 cherry

三、与传统 range(len(...)) 的对比

✅ 推荐写法:

for i, val in enumerate(my_list):
    ...

不推荐写法:

for i in range(len(my_list)):
    val = my_list[i]
    ...

使用 enumerate 语义更清晰、减少索引出错。


四、start 参数作用

可以自定义索引起始值:

for i, fruit in enumerate(fruits, start=1):
    print(f"第{i}个水果是 {fruit}")

输出:

第1个水果是 apple
第2个水果是 banana
第3个水果是 cherry

五、常见用法场景

1. 遍历列表时获取索引

names = ["Alice", "Bob", "Charlie"]
for i, name in enumerate(names):
    print(f"{i}: {name}")

2. 与字典构造器配合使用

d = dict(enumerate(["a", "b", "c"]))
print(d)  # {0: 'a', 1: 'b', 2: 'c'}

3. 使用 enumerate 修改可变对象

nums = [1, 2, 3]
for i, num in enumerate(nums):
    nums[i] = num ** 2
print(nums)  # [1, 4, 9]

4. 配合 zip() 遍历多个列表并附带索引

a = ["x", "y", "z"]
b = [10, 20, 30]
for idx, (ai, bi) in enumerate(zip(a, b)):
    print(f"{idx}: {ai} - {bi}")

六、使用注意事项

问题建议或说明
只能用于可迭代对象否则抛出 TypeError
可用于字符串、元组、列表、集合、字典等注意集合和字典遍历顺序是无序的(除非使用 OrderedDict 或 Python 3.7+)
不能直接修改不可变对象(如字符串)修改要借助列表或其它中间变量
注意 enumerate 返回的是迭代器想多次使用可以 list(enumerate(...))

七、进阶示例

1. 从 enumerate 得到索引和值,并过滤条件

items = ["car", "bike", "train", "plane"]
for i, item in enumerate(items):
    if "a" in item:
        print(f"Index {i}: {item}")

2. 解包 enumerate 生成器

e = enumerate(["A", "B", "C"], start=10)
print(list(e))  # [(10, 'A'), (11, 'B'), (12, 'C')]

3. 使用 enumerate 生成 <index, value> 字符串格式

for i, ch in enumerate("abc", 1):
    print(f"{i}: {ch.upper()}")

输出:

1: A
2: B
3: C

八、与 tqdm 配合使用(进度+索引)

from tqdm import tqdm

for i, data in enumerate(tqdm(dataloader)):
    # i 是 batch 的编号
    pass

九、结语

enumerate() 是你写优雅、清晰、高效 Python 循环结构的必备技能,特别适用于:

  • 遍历时需要索引信息
  • 提高可读性、避免 range(len(...)) 出错
  • 搭配列表推导或 zip() 使用更灵活

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

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

相关文章

最宽温度范围文本格式PT1000分度表-200~850度及PT1000铂电阻温度传感器计算公式

常用PT铂电阻温度传感器 该图片来自网络&#xff0c;在此对图片作者表示感谢。 白色陶瓷面为测温面。 近距离图片。 常用的有PT100、PT500、PT1000&#xff0c;不常用的还有 PT50、PT200、PT10000等&#xff0c;PT代表铂电阻&#xff0c;后面的数字是零摄氏度时电阻值&#…

机器学习算法-sklearn源起

scikit-learn&#xff08;简称 sklearn&#xff09;是 Python 中最流行的开源机器学习库之一&#xff0c;基于 NumPy、SciPy 和 Matplotlib 构建。它提供了丰富的机器学习算法和工具&#xff0c;适用于数据挖掘和数据分析任务。以下是其核心特点的简介&#xff1a; 1、sklearn主…

注册并创建一个微信小程序

目录 &#xff08;一&#xff09;前往微信公众平台&#xff0c;并注册一个微信小程序账号 &#xff08;二&#xff09;配置微信小程序 &#xff08;三&#xff09;创建微信小程序项目 1.流程 1.1获取小程序ID 1.2下载微信开发者工具 1.3安装微信开发者工具 2.创建项目…

计算机网络——每一层的用到的设备及其作用

计算机网络基础 OSI参考模型TCP/IP协议族集线器&#xff08;Hub&#xff09;交换机&#xff08;Switch&#xff09;路由器&#xff08;Router&#xff09;功能特点无线路由器&#xff08;家庭宽带&#xff09;光猫功能 网关&#xff08;Gateway&#xff09;功能应用场景特点 IP…

【Web前端】JavaScript入门与基础(一)

JavaScript简介 JavaScript 是一种轻量级的脚本语言。所谓“脚本语言”&#xff0c;指的是它不具备开发操作系统的能力&#xff0c;而是只用来编写控制其他大型应用程序的“脚本”。 JavaScript 是一种嵌入式&#xff08;embedded&#xff09;语言。它本身提供的核心语法不算…

前端大文件上传性能优化实战:分片上传分析与实战

前端文件分片是大文件上传场景中的重要优化手段&#xff0c;其必要性和优势主要体现在以下几个方面&#xff1a; 一、必要性分析 1. 突破浏览器/服务器限制 浏览器限制&#xff1a;部分浏览器对单次上传文件大小有限制&#xff08;如早期IE限制4GB&#xff09; 服务器限制&a…

Linux服务器配置深度学习环境(Pytorch+Anaconda极简版)

前言&#xff1a; 最近做横向需要使用实验室服务器跑模型&#xff0c;之前用师兄的账号登录服务器跑yolo&#xff0c;3张3090一轮14秒&#xff0c;我本地一张4080laptop要40秒&#xff0c;效率还是快很多&#xff0c;&#xff08;这么算一张4080桌面版居然算力能比肩3090&#…

超低延迟音视频直播技术的未来发展与创新

引言 音视频直播技术正在深刻改变着我们的生活和工作方式&#xff0c;尤其是在教育、医疗、安防、娱乐等行业。无论是全球性的体育赛事、远程医疗、在线教育&#xff0c;还是智慧安防、智能家居等应用场景&#xff0c;都离不开音视频技术的支持。为了应对越来越高的需求&#x…

Java 内存模型(JMM)深度解析:理解多线程内存可见性问题

Java 内存模型&#xff08;JMM&#xff09;深度解析&#xff1a;理解多线程内存可见性问题 在 Java 编程中&#xff0c;多线程的运用能够显著提升程序的执行效率&#xff0c;但与此同时&#xff0c;多线程环境下的一些问题也逐渐凸显。其中&#xff0c;内存可见性问题是一个关…

转移dp简单数学数论

1.转移dp问题 昨天的练习赛上有一个很好玩的起终点问题&#xff0c;第一时间给出bfs的写法。 但是写到后面发现不行&#xff0c;还得是的dp转移的写法才能完美的解决这道题目。 每个格子可以经过可以不经过&#xff0c;因此它的状态空间是2^&#xff08;n*m&#xff09;&…

动静态库--

目录 一 静态库 1. 创建静态库 2. 使用静态库 2.1 第一种 2.2 第二种 二 动态库 1. 创建动态库 2. 使用动态库 三 静态库 VS 动态库 四 动态库加载 1. 可执行文件加载 2. 动态库加载 一 静态库 Linux静态库&#xff1a;.a结尾 Windows静态库&#xff1a;.lib结尾…

git clone时出现无法访问的问题

git clone时出现无法访问的问题 问题&#xff1a; 由于我的git之前设置了代理&#xff0c;然后在这次克隆时又没有打开代理 解决方案&#xff1a; 1、如果不需要代理&#xff0c;直接取消 Git 的代理设置&#xff1a; git config --global --unset http.proxy git config --gl…

文件系统·linux

目录 磁盘简介 Ext文件系统 块 分区 分组 inode 再谈inode 路径解析 路径缓存 再再看inode 挂载 小知识 磁盘简介 磁盘&#xff1a;一个机械设备&#xff0c;用于储存数据。 未被打开的文件都是存在磁盘上的&#xff0c;被打开的加载到内存中。 扇区&#xff1a;是…

【Matlab】雷达图/蛛网图

文章目录 一、简介二、安装三、示例四、所有参数说明 一、简介 雷达图&#xff08;Radar Chart&#xff09;又称蛛网图&#xff08;Spider Chart&#xff09;是一种常见的多维数据可视化手段&#xff0c;能够直观地对比多个指标并揭示其整体分布特征。 雷达图以中心点为原点&…

使用JProfiler进行Java应用性能分析

文章目录 一、基本概念 二、Windows系统中JProfiler的安装 1、下载exe文件 2、安装JProfiler 三、JProfiler的破解 四、IDEA中配置JProfiler 1、安装JProfiler插件 2、关联本地磁盘中JProfiler软件的执行文件 3、IDEA中启动JProfiler 五、监控本地主机中的Java应用 …

遥感解译项目Land-Cover-Semantic-Segmentation-PyTorch之一推理模型

文章目录 效果项目下载项目安装安装步骤1、安装环境2、新建虚拟环境和安装依赖测试模型效果效果 项目下载 项目地址 https://github.com/souvikmajumder26/Land-Cover-Semantic-Segmentation-PyTorch 可以直接通过git下载 git clone https://github.com/souvikmajumder26/Lan…

六、【前端启航篇】Vue3 项目初始化与基础布局:搭建美观易用的管理界面骨架

【前端启航篇】Vue3 项目初始化与基础布局&#xff1a;搭建美观易用的管理界面骨架 前言技术选型回顾与准备准备工作第一步&#xff1a;进入前端项目并安装 Element Plus第二步&#xff1a;在 Vue3 项目中引入并配置 Element Plus第三步&#xff1a;设计基础页面布局组件第四步…

C++ 前缀和数组

一. 一维数组前缀和 1.1. 定义 前缀和算法通过预处理数组&#xff0c;计算从起始位置到每个位置的和&#xff0c;生成一个新的数组&#xff08;前缀和数组&#xff09;。利用该数组&#xff0c;可以快速计算任意区间的和&#xff0c;快速求出数组中某一段连续区间的和。 1.2. …

细胞冻存的注意事项,细胞冻存试剂有哪些品牌推荐

细胞冻存的原理 细胞冻存的基本原理是利用低温环境抑制细胞的新陈代谢&#xff0c;使细胞进入一种“休眠”状态。在低温条件下&#xff0c;细胞的生物活动几乎停止&#xff0c;从而实现长期保存。然而&#xff0c;细胞在冷冻过程中可能会因为细胞内外水分结冰形成冰晶而受损。…

快速上手Linux火墙管理

实验网络环境&#xff1a; 主机IP网络f1192.168.42.129/24NATf2&#xff08;双网卡&#xff09; 192.168.42.128/24 192.168.127.20/24 NAT HOST-NOLY f3192.168.127.30/24HOST-ONLY 一、iptables服务 1.启用iptables服务 2.语法格式及常用参数 语法格式&#xff1a;参数&…