Python中迭代器和生成器实现懒加载以节省内存,迭代器需实现__iter__和__next__方法,生成器函数用yield简化编写并自动支持状态暂停与恢复。
Python 中的迭代器和生成器是实现懒加载、节省内存的关键工具,尤其在处理大数据流、无限序列或资源受限场景时优势明显。它们不一次性把所有数据装入内存,而是按需产出,让程序更轻量、更可控。
迭代器是实现了 __iter__() 和 __next__() 方法的对象。调用 iter() 得到迭代器,反复调用 next() 获取下一个值,直到抛出 StopIteration 异常为止。
自定义迭代器适合封装有明确状态和逻辑的数据遍历过程。例如,读取大文件时逐行迭代,避免一次性读入全部内容:
class LineReader:
def __init__(self, filepath):
self.filepath = filepath
def __iter__(self):
return self
def __next__(self):
try:
if not hasattr(self, 'file'):
self.file = open(self.filepath, 'r', encoding='utf-8')
line = self.file.readline()
if not line:
raise StopIteration
return line.rstrip('\n')
except StopIteration:
self.file.close()
del self.file
raise
for line in LineReader('huge.log'): 即可安全遍历生成器函数使用 yield 关键字返回值,Python 自动将其编译为迭代器对象。它比手写迭代器更简洁、不易出错,且天然支持暂停/恢复执行状态。
典型场景:生成斐波那契数列、过滤日志、解析流式 JSON:
def fibonacci(max_count):
a, b, count = 0, 1, 0
while count < max_count:
yield a
a, b = b, a + b
count += 1
使用方式完全一致
for n in fibonacci(1000000): # 不会创建百万元素列表
if n > 1000:
break
print(n)
yield 让函数变成生成器工厂,调用时不执行,只返回生成器对象next() 触发时,从上次 yield 暂停处继续运行生成器可以像 Unix 管道一样串联,形成清晰、低耦合的数据处理链。每一步都保持懒加载,整条链仍只占用常量内存。
def read_lines(filepath):
with open(filepath) as f:
for line in f:
yield line.strip()
def filter_nonempty(lines):
for line in lines:
if line:
yield line
def parse_json_lines(lines):
import json
for line in lines:
try:
yield json.loads(line)
except json.JSONDecodeError:
continue
组合使用(无中间列表)
for obj in parse_json_lines(filter_nonempty(read_lines('data.jsonl'))):
process(obj) # 每次只处理一个解析后的对象
itertools(如 islice, chain, filterfalse)进一步增强表达力生成器强大但不是万能解药。实际使用中需注意几个关键点:
itertools.islice(gen, 5) 查看前几项yield from 支持委
托子生成器,async def + await 是异步生成器演进方向
# python
# js
# json
# 大数据
# 工具
# 懒加载
# ai
# unix
# 内存占用
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
windows如何测试网速_windows系统网络速度测试方法
Windows10蓝屏SYSTEM_SERVICE_EXCEPTION_Win10驱动冲突排查
如何使用Golang捕获测试日志_Golang testing日志记录方法
Python如何创建带属性的XML节点
php怎么下载安装后设置错误日志_phpini log配置教程【汇总】
PHP 中如何在函数内持久化修改引用变量的指向
Win11怎么开启空间音效_Windows11耳机杜比音效与Sonic设置
Python与GPU加速技术_CUDA与Numba高性能计算实践
Python技术债务管理_长期维护解析【教程】
如何在Golang中优化文件读写性能_使用缓冲和并发处理
如何使用Golang搭建Web开发环境_快速启动HTTP服务
c# 服务器GC和工作站GC的区别和设置
Win11怎么更改任务栏颜色_Windows11个性化重音色设置
如何在 PHP 单元测试中正确模拟带方法的图像处理门面(Facade)
Win10系统怎么查看网络连接状态_Windows10网络和共享中心
Win11怎么设置DNS服务器_Windows11修改网络适配器DNS优选
Win11怎么更改系统语言_Win11中文语言包下载与安装【指南】
php怎么捕获异常_trycatch结构处理运行时错误的技巧【方法】
如何在 Go 后端安全获取并验证前端存储的 JWT?
php命令行怎么运行_通过CLI模式执行PHP脚本的步骤【说明】
Win11笔记本怎么看电池健康度_Win11电池报告生成命令【详解】
Windows10怎么查看硬件信息_Windows10硬件信息查询方法【指南】
Win10怎样设置多显示器_Win10多显示器扩展设置【攻略】
Windows10如何更改桌面背景_Win10个性化幻灯片放映设置
Win10系统字体模糊怎么办_Windows10高级缩放设置修复
c++怎么处理多线程死锁_c++ lock_guard与unique_lock锁管理【技巧】
Win10怎么卸载迅雷_Win10彻底卸载迅雷方法【步骤】
如何关闭Win10自动更新更新_Win10系统自动更新双重关闭技巧
Win11怎么关闭应用权限_Windows11相机麦克风隐私管理
C#如何在一个XML文件中查找并替换文本内容
如何在包含多值的列中精准搜索指定演员?
Windows10系统怎么查看设备管理器_Win10快捷键Win+X菜单使用
c++怎么用jemalloc c++替换默认内存分配器【性能】
如何使用正则表达式批量替换重复的星号-短横模式为固定字符串
PHP怎么接收前端传的时间戳_处理时间戳参数转换技巧汇总【指南】
php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】
如何在 Go 项目开发中正确处理本地包导入与远程模块路径的一致性问题
Windows7如何安装系统镜像_Windows7系统安装教程【步骤】
MAC怎么使用表情符号面板_MAC Emoji快捷键调用与符号查找【方法】
php修改数据怎么批量改状态_批量更新status字段值技巧【操作】
c++怎么调用nana库开发GUI_c++ 现代风格窗口组件与事件处理【实战】
Win11快速助手怎么用_Win11远程协助连接教程【工具】
Python包结构设计_大型项目组织解析【指导】
如何使用Golang实现云原生应用弹性伸缩_自动应对流量变化
如何开启Windows的远程服务器管理工具(RSAT)?(管理服务器)
如何有效拦截拼接式恶意域名的垃圾信息
短链接怎么自定义还原php_修改解码规则适配需求【汇总】
php增删改查报错1054怎么办_字段名错误排查修复【解答】
LINUX的SELinux是什么_详解LINUX强制访问控制系统的入门与配置
c++中的Tag Dispatching是什么_c++利用标签分发优化函数重载【元编程】
2026-01-01
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。