《用得巧,省得妙:深入理解 Python 生成器与迭代器的内存优化魔法》
一、写在前面:为什么你该关心“内存占用”?
在一次数据处理项目中,我曾遇到一个棘手的问题:一个 CSV 文件大小不过 1GB,却频繁导致内存溢出。原因?我一开始用的是 list 把所有数据一次性读入内存。直到我换成生成器(generator),内存占用才从几百 MB 降到几十 KB,程序也不再崩溃。
这就是生成器的魔法:延迟计算、按需生成、节省内存。
在 Python 的世界里,生成器与迭代器是处理大数据、流式数据、懒加载等场景的利器。它们不仅能让你的程序更高效,还能让你写出更优雅的代码。
这篇文章将带你从基础到进阶,全面掌握生成器与迭代器的使用方式、底层原理与实战技巧,帮助你写出更“轻盈”的 Python 程序。
二、基础入门:迭代器与生成器的区别与联系
1. 什么是迭代器(Iterator)?
迭代器是实现了 __iter__() 和 __next__() 方法的对象。它可以被 for 循环消费,也可以手动调用 next() 获取下一个元素。
numbers = [1, 2, 3]
it = iter(numbers)
print(next(it)) # 输出 1
print(next(it)) # 输出 2
2. 什么是生成器(Generator)?
生成器是特殊的迭代器,它通过 yield 语句“懒惰”地产生值。每次调用 next(),生成器函数会从上次 yield 的地方继续执行。
def count_up_to(n):
i = 1
while i <= n:
yield i
i += 1
for num in count_up_to(3):
print(num)
输出:
1
2
3
3. 为什么生成器更节省内存?
因为生成器不会一次性把所有数据加载到内存中,而是按需生成。这在处理大文件、网络流、数据库分页等场景中尤为重要。
三、实战演练:生成器的内存优势对比
示例:读取百万行日志文件
假设我们有一个 100 万行的日志文件 logs.txt,每行约 200 字节,总大小约 200MB。
方法一:一次性读取(高内存)
with open('logs.txt') as f

最低0.47元/天 解锁文章
313

被折叠的 条评论
为什么被折叠?



