Python基础入门 Day98 使用迭代器和生成器优化内存

119次阅读
没有评论

共计 1449 个字符,预计需要花费 4 分钟才能阅读完成。

在处理大量数据时,如果一次性将所有数据加载到内存中,会导致内存占用过高甚至程序崩溃。Python 提供的迭代器(Iterator)和生成器(Generator)机制,可以让我们在需要时才逐步获取数据,实现“惰性计算”,从而有效节省内存。

  1. 迭代器基础
    迭代器是实现了 __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,迭代器会逐步返回数据,而不是一次性生成。

  1. 生成器函数
    生成器是迭代器的一种快捷实现方式,使用 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,但实现更简洁。

  1. 生成器表达式
    类似于列表推导式,生成器表达式使用圆括号,可以按需生成数据:
squares = (x*x for x in range(1, 6))
print(squares)        # <generator object <genexpr> ...>
for num in squares:
    print(num)

这种方式不会一次性生成所有数据,而是每次迭代时动态计算结果。

  1. 生成器的优势
  • 节省内存 :适合处理大文件或大数据集。
  • 惰性计算 :按需计算,避免无效操作。
  • 可组合性强 :多个生成器可以像流水线一样组合使用。

示例:读取大文件

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)

这种方式不会一次性把整个文件读入内存,而是逐行读取。

  1. 迭代工具 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 模块进一步扩展了迭代器的功能,是处理复杂数据流的重要工具。

练习与思考:

  1. 使用生成器函数实现一个无限斐波那契数列,并在外部控制取前 20 个数。
  2. 使用生成器表达式计算从 1 到 1000000 的平方和,比较内存占用与列表推导式的差别。
  3. 尝试用 itertools 实现无限循环一个列表 [1,2,3] 并限制输出 10 个元素。
正文完
 0
评论(没有评论)