Python迭代器生成器进阶教程_节省内存与懒加载实战


Python中迭代器和生成器实现懒加载以节省内存,迭代器需实现__iter__和__next__方法,生成器函数用yield简化编写并自动支持状态暂停与恢复。

Python 中的迭代器和生成器是实现懒加载、节省内存的关键工具,尤其在处理大数据流、无限序列或资源受限场景时优势明显。它们不一次性把所有数据装入内存,而是按需产出,让程序更轻量、更可控。

理解迭代器:可被 next() 驱动的对象

迭代器是实现了 __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 简化迭代器编写

生成器函数使用 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) # 每次只处理一个解析后的对象

  • 每个函数职责单一,易于测试和复用
  • 整个流程不会因文件过大而 OOM,哪怕文件是 GB 级别
  • 可配合 itertools(如 islice, chain, filterfalse)进一步增强表达力

进阶提醒:生成器的边界与注意事项

生成器强大但不是万能解药。实际使用中需注意几个关键点:

  • 生成器只能遍历一次,多次使用需重新构造(可包装成类或工厂函数)
  • 调试困难:无法直接索引、切片或查看长度,可用 itertools.islice(gen, 5) 查看前几项
  • 异常传播:若生成器内部抛出异常,会原样传递给调用方,建议在 yield 前加 try/except
  • 协程扩展:Python 3.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


相关推荐: Windows10如何重置此电脑_Windows10电脑重置方法【步骤】  php打包exe后无法写入文件_权限问题解决方法【教程】  如何在Golang中处理云原生事件_使用Event和Notification机制  PyTorch DDP 多进程训练在 Kaggle 笔记本中的正确启动方式  Windows10电脑怎么设置虚拟内存_Win10高级系统设置性能  php中self::能调用子类重写的方法吗_静态绑定与重写关系【介绍】  Python数据挖掘进阶教程_分类回归与聚类案例解析  如何在 ACF 中正确更新嵌套多层 Group 字段内的子字段  如何使用Golang模拟请求超时_Golang context与HTTP请求测试实践  Python日志系统设计与实现_高可观测性架构实战  如何在JavaScript中动态拼接PHP的base_url与前端变量  Win11如何设置开机自动联网 Win11宽带连接自动拨号【步骤】  Python深度学习实战教程_神经网络模型构建与训练  c++怎么使用std::unique实现去重_c++ 容器元素排序与连续重复删除【教程】  Python网页解析流程_html结构说明【指导】  如何使用Golang实现容器安全扫描_Golang Docker镜像漏洞检测方法  Win11怎么更改输入法顺序_Win11调整语言首选位置【设置】  Mac怎么给文件夹加密_Mac创建加密磁盘映像教程【安全】  Win11怎么开启专注模式_Windows11时钟应用Focus Session  Python变量绑定机制_引用模型解析【教程】  C#怎么创建控制台应用 C# Console App项目创建方法  Win11怎么查看电脑配置_Win11硬件配置详细查询方法【详解】  如何在Golang中处理JSON字段缺失_Golangjson解析字段校验方法  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  Windows怎样关闭锁屏广告_Windows关闭锁屏广告方法【教程】  c++协程和线程的区别 c++异步编程模型对比【核心】  如何使用Golang实现文件追加操作_向已有文件追加数据  c++怎么处理多线程死锁_c++ lock_guard与unique_lock锁管理【技巧】  C++中的constexpr和const有什么区别?(编译期常量)  Win11如何开启系统更新 Win11开启系统更新方法【步骤】  Windows10任务栏图标变成白色文件_Win10重建图标缓存修复方法  Golang如何测试HTTP中间件_Golang HTTP中间件功能测试实践  MAC如何启用访达侧边栏显示_MAC Finder偏好设置与常用目录添加【教程】  如何在同包不同文件中正确引用 Go 结构体  网站体验不好=浪费钱:如何提升-用户体验效果差  PythonPandas数据分析教程_数据清洗与处理技巧  mac怎么分屏_MAC双屏显示与分屏操作技巧【指南】  VSC怎么快速定位PHP错误行_错误追踪设置法【方法】  Win11怎么关闭定位服务_保护Win11位置隐私设置指南【详解】  Win11怎么关闭任务栏小组件_Windows11隐藏任务栏天气图标  如何用::实现工具类方法调用_php静态工具类设计技巧【技巧】  XML的“混合内容”是什么 怎么用DTD或XSD定义  Python数据抓取合法性_合规说明【指导】  Win10怎样清理C盘阿里旺旺缓存_Win10清理阿里旺旺缓存步骤【步骤】  如何在 PHP 中按相同键合并两个关联数组为二维数组  如何提升Golang JSON序列化性能_Golang JSON编码效率优化方法  Win11怎么关闭触摸键盘图标_Windows11任务栏系统托盘设置  Mac如何开启夜览模式_Mac护眼模式设置与定时  Linux如何使用grep搜索文件内容_Linux下正则表达式匹配与查找技巧【指南】  c++ std::future和std::promise c++线程间通信【教程】 

 2026-01-01

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.