Python中迭代器和生成器实现懒加载以节省内存,迭代器需实现__iter__和__next__方法,生成器函数用yield简化编写并自动支持状态暂停与恢复。
Python 中的迭代器和生成器是实现懒加载、节省内存的关键工具,尤其在处理大数据流、无限序列或资源受限场景时优势明显。它们不一次性把所有数据装入内存,而是按需产出,让程序更轻量、更可控。
迭代器是实现了 __iter__() 和 __next__() 方法的对象。调用 iter() 得到迭代器,反复调用 next() 获取下一个值,直到抛出 StopIteration 异常为止。
自定义迭代器适合封装有明确状态和逻辑的数据遍历过程。例如,读取大文件时逐行迭代,避免一次性读入全部内容:
class LineReader:
def __init__(self, fil
epath):
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
# 内存占用
相关文章:
香港服务器WordPress建站指南:SEO优化与高效部署策略
jQuery 常见小例汇总
营销式网站制作方案,销售哪个网站招聘效果最好?
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
html制作网站的步骤有哪些,iapp如何添加网页?
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解
公司门户网站制作流程,华为官网怎么做?
如何在建站主机中优化服务器配置?
免费制作小说封面的网站有哪些,怎么接网站批量的封面单?
网站制作新手教程,新手建设一个网站需要注意些什么?
如何配置支付宝与微信支付功能?
广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的?
建站之星图片链接生成指南:自助建站与智能设计教程
已有域名和空间,如何快速搭建网站?
建站为何优先选择香港服务器?
商务网站制作工程师,从哪几个方面把握电子商务网站主页和页面的特色设计?
公司网站制作费用多少,为公司建立一个网站需要哪些费用?
网站制作企业,网站的banner和导航栏是指什么?
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
电商网站制作公司有哪些,1688网是什么意思?
如何通过服务器快速搭建网站?完整步骤解析
清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?
建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南
C#怎么创建控制台应用 C# Console App项目创建方法
山东网站制作公司有哪些,山东大源集团官网?
Thinkphp 中 distinct 的用法解析
移民网站制作流程,怎么看加拿大移民官网?
制作企业网站建设方案,怎样建设一个公司网站?
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
如何选择美橙互联多站合一建站方案?
网站制作报价单模板图片,小松挖机官方网站报价?
怎么将XML数据可视化 D3.js加载XML
如何基于云服务器快速搭建网站及云盘系统?
php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】
免费视频制作网站,更新又快又好的免费电影网站?
建站之星代理商如何保障技术支持与售后服务?
开封网站制作公司,网络用语开封是什么意思?
C++如何使用std::optional?(处理可选值)
建站之星上传入口如何快速找到?
如何通过西部建站助手安装IIS服务器?
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
成都网站制作报价公司,成都工业用气开户费用?
c# 在高并发下使用反射发射(Reflection.Emit)的性能
建站之星如何快速更换网站模板?
建站之星官网登录失败?如何快速解决?
如何通过WDCP绑定主域名及创建子域名站点?
北京的网站制作公司有哪些,哪个视频网站最好?
*请认真填写需求信息,我们会在24小时内与您取得联系。