五分钟搞懂python生成器迭代器

本文介绍了Python中的迭代器和生成器概念,阐述它们如何简化遍历操作、提高效率,特别强调了在处理大规模数据集时的内存管理和惰性计算优势。通过实例演示了如何用生成器处理大文件,以及在服务器内存限制下读取和处理5GB数据的方法。
摘要由CSDN通过智能技术生成

生成器和迭代器都是Python语言中的重要概念。由于这两个概念比较抽象,但看文字比较难理解,所以本次我将概念和案例结合在一起,这样能够更好得搞懂这些知识点。

1.迭代器

迭代器是一种对象,它提供了一种遍历集合中元素的方式。它的作用是按照特定的顺序逐个访问集合中的元素,而不需要事先知道集合的长度或者将整个集合加载到内存中。

在python总可通过调用 next() 方法来获取下一个元素。使用迭代器可以简化代码,提高效率,并且适用于处理大规模数据集合。

案例:
假设我们有一个非常大的列表,如果一次性将整个列表加载到内存中可能导致内存溢出,而使用迭代器可以避免这种情况:

# 生成一个非常大的列表,例如1到1000000
big_list = range(1, 1000001)

# 使用迭代器逐个处理列表元素,而不是一次性加载整个列表到内存
iter_obj = iter(big_list)

# 计算列表中所有元素的总和
total_sum = 0
try:
    while True:
        element = next(iter_obj)
        total_sum += element
except StopIteration:
    pass

# 输出总和
print("Total sum:", total_sum)

在这个案例中,我们生成了一个非常大的列表big_list,然后使用迭代器iter_obj逐个处理列表元素,计算所有元素的总和。由于我们只在需要时逐个获取元素,而不是一次性加载整个列表到内存中,因此可以有效地节省内存空间,避免内存溢出问题

2. 生成器

生成器是一种特殊的迭代器,按需生成值,而不是一次性产生所有值,节省内存并支持惰性计算。

下面是一个使用生成器的简单示例,该生成器返回斐波那契数列中的每个数字:

def fibonacci_generator():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

fib = fibonacci_generator()

# 打印前 10 个斐波那契数
for i in range(10):
    print(next(fib))


通过循环迭代该生成器,我们可以打印出前 10 个斐波那契数。由于生成器是按需计算的,它不会一次性生成整个斐波那契数列,而是根据需要逐个生成。这种方式节省了内存,并且能够支持无限序列

每次调用生成器对象的 next() 方法时,生成器函数会从上一次 yield 语句的位置开始执行,直到遇到下一个 yield 语句为止。这意味着生成器是按需生成值的,只有在需要时才会生成值。

3、生产案例

这里我们通过一个面试题带大家去深入理解

服务器4G 内存怎么读取一个 5G 的数据?

答:通过生成器,分多次读取,每次读取数量相对少的数据(比如 500MB)进行处理,处理结束后
在读取后面的 500MB 的数据。

# 定义一个生成器函数,在python中只要函数中使用yield字段就是一个生成器函数。生成器函数 用于创建 生成器迭代器 (generator iterator)。
def process_data(file_path, batch_size):
    with open(file_path, 'rb') as file:
        while True:
            data = file.read(batch_size)
            if not data:
                break
            # 在此处进行对数据的处理
            # 可以将处理后的结果返回,或者做其他操作
            yield data

# 使用示例
file_path = 'your_file_path'  # 文件路径
batch_size = 500 * 1024 * 1024  # 500MB,注意单位为字节

data_generator = process_data(file_path, batch_size)

#迭代方法一
while True:
    try:
        batch = next(data_generator)
        # 对每个批次的数据进行处理
    	# 可以调用相应的函数或方法进行处理
    	print(f"Processing {len(batch)} bytes of data")
    	# 这里只是简单示例,实际处理需要根据具体需求进行编写
    except StopIteration:
        break

#迭代方法二
#for batch in data_generator:
#	print(f"Processing {len(batch)} bytes of data")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值