yield在我们读取大数据时是必用的一个函数,它可以帮我们规避内存溢出等问题,那么在哪些环节我们需要用到它,及为何它能帮我们在众多场景中解决内存溢出问题。
我们先看下面的示例
def csv_reader(file):
file = open(file, encoding='utf-8')
result = file.read().split("\n")
return result
if name == 'main':
csv_gen = csv_reader("test.txt")
row_count = 0
for row in csv_gen:
row_count += 1
print(f"Row count is {row_count}")
上面的例子通过read直接将内容一次性加载到内存,当数据非常大时,内存直接会溢出,导致整个主机崩溃。
我们再看下面的例子
def csv_reader(file_name):
for row in open(file_name, "r", encoding='utf-8'):
yield row
if name == 'main':
csv_gen = csv_reader("test.txt")
row_count = 0
for row in csv_gen:
row_count += 1
print(f"Row count is {row_count}")
这个例子通过yield函数返回一个生成器对象,每次只读取一行数据,所以对内存几乎没什么影响,open函数也是一个生成器,一行一行的读取数据