共计 1449 个字符,预计需要花费 4 分钟才能阅读完成。
在处理大量数据时,如果一次性将所有数据加载到内存中,会导致内存占用过高甚至程序崩溃。Python 提供的迭代器(Iterator)和生成器(Generator)机制,可以让我们在需要时才逐步获取数据,实现“惰性计算”,从而有效节省内存。
- 迭代器基础
迭代器是实现了__iter__()和__next__()方法的对象。
# 一个简单的迭代器
class MyIterator:
def __init__(self, limit):
self.limit = limit
self.current = 0
def __iter__(self):
return self
def __next__(self):
if self.current < self.limit:
self.current += 1
return self.current
else:
raise StopIteration
it = MyIterator(5)
for num in it:
print(num)
执行结果是 1 2 3 4 5,迭代器会逐步返回数据,而不是一次性生成。
- 生成器函数
生成器是迭代器的一种快捷实现方式,使用yield关键字即可:
def count_up_to(limit):
current = 1
while current <= limit:
yield current
current += 1
for num in count_up_to(5):
print(num)
执行结果同样是 1 2 3 4 5,但实现更简洁。
- 生成器表达式
类似于列表推导式,生成器表达式使用圆括号,可以按需生成数据:
squares = (x*x for x in range(1, 6))
print(squares) # <generator object <genexpr> ...>
for num in squares:
print(num)
这种方式不会一次性生成所有数据,而是每次迭代时动态计算结果。
- 生成器的优势
- 节省内存 :适合处理大文件或大数据集。
- 惰性计算 :按需计算,避免无效操作。
- 可组合性强 :多个生成器可以像流水线一样组合使用。
示例:读取大文件
def read_large_file(filepath):
with open(filepath, 'r', encoding='utf-8') as f:
for line in f:
yield line.strip()
for line in read_large_file('large.txt'):
print(line)
这种方式不会一次性把整个文件读入内存,而是逐行读取。
- 迭代工具 itertools
Python 内置itertools模块,提供了很多迭代器工具:
import itertools
# 无限迭代
for num in itertools.count(1):
if num > 5:
break
print(num)
# 组合与排列
for combo in itertools.combinations([1,2,3], 2):
print(combo)
itertools 模块可以帮助我们高效构造复杂的迭代逻辑。
总结:
- 迭代器提供逐步访问数据的方法,避免一次性加载。
- 生成器通过
yield语句或生成器表达式实现,语法简洁。 - 在处理大数据或流式数据时,使用生成器能显著减少内存占用。
itertools模块进一步扩展了迭代器的功能,是处理复杂数据流的重要工具。
练习与思考:
- 使用生成器函数实现一个无限斐波那契数列,并在外部控制取前 20 个数。
- 使用生成器表达式计算从 1 到 1000000 的平方和,比较内存占用与列表推导式的差别。
- 尝试用
itertools实现无限循环一个列表[1,2,3]并限制输出 10 个元素。
正文完