python基础入门:7.1迭代器与生成器
Python迭代器与生成器深度解析:高效处理海量数据的利器
# 大文件分块读取生成器模板
def chunked_file_reader(file_path, chunk_size=1024*1024):"""分块读取大文件生成器"""with open(file_path, 'r', encoding='utf-8') as f:while True:chunk = f.read(chunk_size)if not chunk:breakyield chunk# 使用示例
for chunk in chunked_file_reader('huge_log.txt'):process_chunk(chunk)
一、迭代器协议深度解析
- 迭代器协议组成要素
class CustomIterator:"""自定义迭代器实现"""def __init__(self, data):self.data = dataself.index = 0def __iter__(self):return self # 返回迭代器对象本身def __next__(self):if self.index >= len(self.data):raise StopIterationvalue = self.data[self.index]self.index += 1return value# 使用示例
colors = CustomIterator(['red', 'green', 'blue'])
for color in colors:print(color)
- 可迭代对象与迭代器区别
特性 | 可迭代对象 | 迭代器 |
---|---|---|
实现方法 | __iter__ | __iter__ + __next__ |
状态保持 | 无 | 保持迭代状态 |
多次迭代 | 每次创建新迭代器 | 单次耗尽 |
内存占用 | 通常较大 | 通常较小 |
典型示例 | list, dict, str | file对象, generator |
二、生成器核心机制
- 生成器函数工作原理
def fibonacci_generator(max_count):"""斐波那契数列生成器"""a, b = 0, 1count = 0while count < max_count:yield aa, b = b, a + bcount += 1# 生成器执行状态演示
gen = fibonacci_generator(5)
print(next(gen)) # 0
print(next(gen)) # 1
print(next(gen)) # 1
print(next(gen)) # 2
print(next(gen)) # 3
# next(gen) # 触发StopIteration
- 生成器高级特性
# 协程通信
def data_processor():"""带状态的数据处理器"""total = 0count = 0while True:value = yield # 接收数据if value is None:breaktotal += valuecount += 1return (total, total/count)# 使用示例
proc = data_processor()
next(proc) # 激活生成器
proc.send(10)
proc.send(20)
proc.send(30)
try:proc.send(None)
except StopIteration as e:print(f"计算结果: {e.value}") # (60, 20.0)
三、大文件处理实战
- 多种文件读取方式对比
def read_entire_file(file_path):"""一次性读取整个文件"""with open(file_path) as f:return f.read() # 内存杀手!def read_line_by_line(file_path):"""逐行读取文件"""with open(file_path) as f:for line in f:yield linedef read_in_chunks(file_path, chunk_size=4096):"""固定块大小读取"""with open(file_path, 'rb') as f:while chunk := f.read(chunk_size):yield chunkdef smart_reader(file_path, max_lines=1000):"""智能分块读取(自动调整块大小)"""buffer = []with open(file_path) as f:for line in f:buffer.append(line)if len(buffer) >= max_lines:yield bufferbuffer = []if buffer:yield buffer
- 生产级大文件处理器
class LogFileAnalyzer:"""日志文件分析器"""def __init__(self, file_path):self.file_path = file_pathself._line_count = 0self._error_count = 0def __iter__(self):"""实现迭代器协议"""with open(self.file_path, 'r', errors='replace') as f:for line in f:self._line_count += 1try:parsed = self._parse_line(line)except InvalidLogFormat:self._error_count += 1continueyield parseddef _parse_line(self, line):"""解析单行日志"""if 'ERROR' in line:return self._parse_error(line)# 其他解析逻辑...@propertydef stats(self):return {'total_lines': self._line_count,'error_lines': self._error_count}# 使用示例
analyzer = LogFileAnalyzer('server.log')
for entry in analyzer:process_log_entry(entry)
print(f"分析统计: {analyzer.stats}")
四、性能优化与高级技巧
- 生成器表达式优化
# 传统列表推导式(立即加载所有数据)
squares = [x**2 for x in range(1000000)] # 占用大量内存# 生成器表达式(惰性计算)
squares_gen = (x**2 for x in range(1000000)) # 内存友好# 管道式处理
result = (x * 2 for x in squares_gen if x % 3 == 0
)
- 内存优化对比测试
import sysdata_list = [i for i in range(1000000)]
print(f"列表内存占用: {sys.getsizeof(data_list)/1024/1024:.2f} MB")data_gen = (i for i in range(1000000))
print(f"生成器内存占用: {sys.getsizeof(data_gen)} bytes")
- 异步生成器(Python 3.6+)
import aiofilesasync def async_file_reader(file_path):"""异步文件读取生成器"""async with aiofiles.open(file_path, mode='r') as f:async for line in f: # 异步迭代yield line.strip()# 使用示例
async def process_large_file():async for line in async_file_reader('bigfile.txt'):await process_line(line)
最佳实践清单:
- 优先使用生成器处理大型数据集
- 避免在生成器中修改外部状态
- 使用
itertools
模块优化迭代逻辑 - 对无限生成器设置安全终止条件
- 合理选择块大小(通常4KB-1MB)
- 使用
yield from
简化嵌套生成器 - 结合上下文管理器管理资源
- 使用类型注解提高可读性
# 带类型注解的生成器
from typing import Generator, Iteratordef countdown(n: int) -> Generator[int, None, None]:"""倒计时生成器"""while n > 0:yield nn -= 1# 使用yield from
def flatten(nested_list) -> Iterator:"""嵌套列表展开器"""for item in nested_list:if isinstance(item, (list, tuple)):yield from flatten(item)else:yield item
性能对比测试(处理1GB日志文件):
方法 | 内存占用 | 执行时间 | CPU使用率 |
---|---|---|---|
一次性读取 | 2.1GB | 12s | 85% |
逐行读取 | 45MB | 25s | 65% |
分块读取(1MB) | 52MB | 18s | 78% |
异步分块读取 | 48MB | 15s | 92% |
相关文章:

python基础入门:7.1迭代器与生成器
Python迭代器与生成器深度解析:高效处理海量数据的利器 # 大文件分块读取生成器模板 def chunked_file_reader(file_path, chunk_size1024*1024):"""分块读取大文件生成器"""with open(file_path, r, encodingutf-8) as f:while Tru…...

Docker 容器 Elasticsearch 启动失败完整排查记录
背景 在服务器上运行 Docker 容器 es3,但 Elasticsearch 无法正常启动,运行 docker ps -a 发现 es3 处于 Exited (1) 状态,即进程异常退出。 本次排查从错误日志、容器挂载、权限问题、SELinux 影响、内核参数等多个方面入手,最…...

达梦数据使用笔记
相关文档: 达梦官网 达梦技术文档 1.安装完成后在开始菜单中搜索DM 目录:C:\ProgramData\Microsoft\Windows\Start Menu\Programs\达梦数据库 下有所有相关信息 2.数据迁移 https://eco.dameng.com/document/dm/zh-cn/start/mysql_dm.html https:…...

操作系统中的任务调度算法
一、引言 在操作系统中,任务调度算法是核心组件之一,它负责合理分配有限的 CPU 资源,以确保系统的高效运行和良好的用户体验。任务调度的目标是实现公平性、最小化等待时间、提高系统吞吐量,并最大化 CPU 的利用率。不同的任务调…...

Linux 虚拟服务器(LVS)技术详解
一、LVS 概述 Linux 虚拟服务器(Linux Virtual Server,简称 LVS)是由章文嵩博士开发的一种开源的服务器集群技术,它工作在 Linux 内核空间,为构建高可用、可扩展的网络服务提供了一种高效的解决方案。LVS 可以将多个真…...

AIoT时代来临,物联网技术如何颠覆未来生活?
在这个万物互联的时代,“物联网”(IoT)正以前所未有的速度改变我们的生活,而“AIoT”则是在物联网基础上融入人工智能技术,赋予设备更高的智能和自主决策能力。随着5G、边缘计算和云技术的不断发展,物联网正…...

C++17 新特性解析
C++17 是 C++ 标准的一个重要更新,它在 C++11/14 的基础上引入了许多新特性,进一步简化了代码编写、提升了性能和类型安全性。以下是 C++17 的主要特性分类介绍: 一、语言核心改进 1. 结构化绑定(Structured Bindings) 允许将元组、结构体或数组的成员直接解包到变量中。…...

嵌入式软件C语言面试常见问题及答案解析(四)
嵌入式软件C语言面试常见问题及答案解析(四) 原本打算将链表相关的面试题整合到一个文档中,奈何写着写着就发现题目比较多,题型也比较丰富,所以导致上一篇已经足够长了,再长也就有点不礼貌了。 所以在这儿继续来总结分享那个面试中遇到的题目,文中的问题和提供的答案或者…...

在 C# 中,处理 Excel 和 PDF 文件的库有很多。以下是一些比较常用的选择
读取 Excel 文件的库 NPOI 用途:可以读取和写入 .xls 和 .xlsx 文件。特点:无需安装 Microsoft Office,支持简单的 Excel 操作,如格式化、公式、图表等。 EPPlus 用途:主要用于 .xlsx 格式(Excel 2007 及以…...

绩效归因概述
绩效归因概述 1. 分类2. 基于净值的归因方法2.1 发展背景2.2 择时选股模型 T-M模型2.3 择时选股模型 H-M模型2.4 择时选股模型 C-L模型2.5 风格配置模型-Sharpe2.6 多因子模型 Fama-French32.7 多因子模型 Carhart42.8 多因子模型 Fama-French5 3. 基于持仓的归因方法3.1 发展背…...

Spring Boot 中加载多个 YAML 配置文件
在 Spring Boot 中加载多个 YAML 配置文件是一个常见的需求,通常用于将配置信息分离到多个文件中以便于管理和维护。Spring Boot 提供了灵活的方式来加载多个 YAML 配置文件。 以下是一些方法和步骤,用于在 Spring Boot 应用中加载多个 YAML 配置文件&a…...

厚植创新实力、聚焦生物科技:柏强制药的责任与机遇
在当今快速发展的医药行业中,创新已成为企业竞争的核心动力。贵州柏强制药作为医药领域的佼佼者,正以科技创新为引领,聚焦生物科技领域,不断突破,不仅为人民的健康事业贡献力量,更在激烈的市场竞争中抓住了…...

Linux中getifaddrs函数
文章目录 **函数原型****参数****返回值****释放资源****`struct ifaddrs` 结构****示例代码****输出示例****相关函数****总结**getifaddrs 是 Linux(以及其他 Unix-like 系统)中用于获取本机网络接口信息的系统调用。它提供了一种简单的方法来获取所有网络接口的地址信息,…...

【HarmonyOS Next 自定义可拖拽image】
效果图: 代码: import display from "ohos.display" import { AppUtil } from "pura/harmony-utils"/*** 自定义可拖拽图标组件*/ Component export default struct DraggableImage {imageResource?: ResourceimageHeight: numbe…...

解决No module named ‘llama_index.llms.huggingface‘
执行下面的脚本,报错No module named llama_index.llms.huggingface’执行下面的脚本,报错No module named llama_index.llms.huggingface’执行下面的脚本,报错No module named llama_index.llms.huggingface’执行下面的脚本,报…...

SearchBar组件的功能与用法
文章目录 1. 概念介绍2. 使用方法3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"Material3中的IconButton"相关的内容,本章回中将介绍SearchBar组件.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本…...

13.推荐系统的性能优化
接下来我们将学习推荐系统的性能优化。推荐系统的性能优化对于提升推荐结果的生成速度和系统的可扩展性至关重要,尤其是在处理大规模数据和高并发请求时。在这一课中,我们将介绍以下内容: 性能优化的重要性常见的性能优化方法实践示例 1. 性…...

Grafana-使用Button修改MySQL数据库
背景 众所周知,Grafana是一个用来展示数据的平台,但是有时候还是会有需求说能不能有一个按钮,点击的时候再对数据库进行修改,从而达到更新数据的效果 经过多方查证,终于实现了一个简单的,点击button执行sq…...

飞科FH6218电吹风异响维修
前言 本文仅记录一次普通的维修经历,解决方案也都是从网上查找资料得来,仅供参考,如有不对请指出,谢谢! 现象 使用时出现异响,风速越大越响 参考视频 https://www.bilibili.com/video/BV1dD4y1x7hH/?…...

分治下的快速排序(典型算法思想)—— OJ例题算法解析思路
目录 一、75. 颜色分类 - 力扣(LeetCode) 运行代码: 一、算法核心思想 二、指针语义与分区逻辑 三、操作流程详解 四、数学正确性证明 五、实例推演(数组[2,0,2,1,1,0]) 六、工程实践优势 七、对比传统实现 八、潜在问题与解决方案 九、性能测试数据 十、扩展…...

Unity3D实现显示模型线框(shader)
系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、效果展示👉二、第一种方式👉二、第二种方式👉壁纸分享👉总结👉前言 在 Unity 中显示物体线框主要基于图形渲染管线和特定的渲染模式。 要显示物体的线框,通常有两种常见的方法:一种是利用内置的渲染…...

深度剖析责任链模式
一、责任链模式的本质:灵活可扩展的流水线处理 责任链模式(Chain of Responsibility Pattern)是行为型设计模式的代表,其核心思想是将请求的发送者与接收者解耦,允许多个对象都有机会处理请求。这种模式完美解决了以下…...

基于 openEuler 构建 LVS-DR 群集
一、 对比 LVS 负载均衡群集的 NAT 模式和 DR 模式,比较其各自的优势 。 二、 基于 openEuler 构建 LVS-DR 群集。 一 NAT 模式 部署简单:NAT 模式下,所有的服务器节点只需要连接到同一个局域网内,通过负载均衡器进行网络地址转…...

CSS3+动画
浏览器内核以及其前缀 css标准中各个属性都要经历从草案到推荐的过程,css3中的属性进展都不一样,浏览器厂商在标准尚未明确的情况下提前支持会有风险,浏览器厂商对新属性的支持情况也不同,所有会加厂商前缀加以区分。如果某个属性…...

使用DeepSeek和Kimi快速自动生成PPT
目录 步骤1:在DeepSeek中生成要制作的PPT主要大纲内容。 (1)在DeepSeek网页端生成 (2)在本地部署DeepSeek后,使用chatBox生成PPT内容 步骤2:将DeepSeek成的PPT内容复制到Kimi中 步骤3&…...

DeepSeek使用最佳实践
一、核心使用原则 任务结构化设计 明确目标:例如用“我需要生成包含5个功能的Python计算器代码”而非简单“帮我写代码”。分步拆解:复杂任务可拆成“需求分析->框架搭建->代码生成->测试验证”等阶段。格式约束:明确输出格式&…...

机器学习 - 进一步理解最大似然估计和高斯分布的关系
一、高斯分布得到的是一个概率吗? 高斯分布(也称为正态分布)描述的是随机变量在某范围内取值的概率分布情况。其概率密度函数(PDF)为: 其中,μ 是均值,σ 是标准差。 需要注意的是…...

Oracle常用导元数据方法
1 说明 前两天领导发邮件要求导出O库一批表和索引的ddl语句做国产化测试,涉及6个系统,6千多张表,还好涉及的用户并不多,要不然很麻烦。 如此大费周折原因,是某国产库无法做元数据迁移。。。额,只能我手动导…...

linux安装jdk 许可证确认 user did not accept the oracle-license-v1-1 license
一定要接受许可证,不然会出现 一、添加 ppa第三方软件源 sudo add-apt-repository ppa:ts.sch.gr/ppa二、更新系统软件包列表 sudo apt-get update三、接受许可证 echo debconf shared/accepted-oracle-license-v1-1 select true | sudo debconf-set-selection…...

Spring基于文心一言API使用的大模型
有时做项目我们可能会遇到要在项目中对接AI大模型 本篇文章是对使用文心一言大模型的使用总结 前置任务 在百度智能云开放平台中注册成为开发者 百度智能云开放平台 进入百度智能云官网进行登录,点击立即体验 点击千帆大模型平台 向下滑动,进入到模型…...