需求

完成一个函数, 从文件中读取数据并按行解析

错误的实现

def items(file_name):
    l = []
    for line in open(file_name):
        l.append(parse(line))
    return l

这样实现会将文件全部读入内存后才能返回所有解析好的数据列表, 在处理大文件时会变得非常慢,非常慢,非常慢

正确的实现

def items(file_name):
    for line in open(file_name):
        yield parse(line)

使用生成器的方式, 可以保留 open 提供的惰性读取特性, 使得内存占用很小

tips

当需要同时读取两个文件时, 不要使用 for i, j in zip(a, b) 去处理, 因为 zip 需要把 a, b 全部读入, 这样破坏了惰性读取的特性.

正确的做法:

f1 = items(file_name1)
f2 = items(file_name2)
while True:
    try:
        i = f1.next()
        j = f2.next()
    except StopIteration:
        break

主动调用生成器的 next 方法可以在使用多个生成器时保留其惰性.


  Python
  Python, file, read