当前位置: 首页 > news >正文

python基础入门:7.1迭代器与生成器

Python迭代器与生成器深度解析:高效处理海量数据的利器

# 大文件分块读取生成器模板
def chunked_file_reader(file_path, chunk_size=1024*1024):"""分块读取大文件生成器"""with open(file_path, 'r', encoding='utf-8') as f:while True:chunk = f.read(chunk_size)if not chunk:breakyield chunk# 使用示例
for chunk in chunked_file_reader('huge_log.txt'):process_chunk(chunk)
一、迭代器协议深度解析
  1. 迭代器协议组成要素
class CustomIterator:"""自定义迭代器实现"""def __init__(self, data):self.data = dataself.index = 0def __iter__(self):return self  # 返回迭代器对象本身def __next__(self):if self.index >= len(self.data):raise StopIterationvalue = self.data[self.index]self.index += 1return value# 使用示例
colors = CustomIterator(['red', 'green', 'blue'])
for color in colors:print(color)
  1. 可迭代对象与迭代器区别
特性可迭代对象迭代器
实现方法__iter____iter__ + __next__
状态保持保持迭代状态
多次迭代每次创建新迭代器单次耗尽
内存占用通常较大通常较小
典型示例list, dict, strfile对象, generator
二、生成器核心机制
  1. 生成器函数工作原理
def fibonacci_generator(max_count):"""斐波那契数列生成器"""a, b = 0, 1count = 0while count < max_count:yield aa, b = b, a + bcount += 1# 生成器执行状态演示
gen = fibonacci_generator(5)
print(next(gen))  # 0
print(next(gen))  # 1
print(next(gen))  # 1
print(next(gen))  # 2
print(next(gen))  # 3
# next(gen)  # 触发StopIteration
  1. 生成器高级特性
# 协程通信
def data_processor():"""带状态的数据处理器"""total = 0count = 0while True:value = yield  # 接收数据if value is None:breaktotal += valuecount += 1return (total, total/count)# 使用示例
proc = data_processor()
next(proc)  # 激活生成器
proc.send(10)
proc.send(20)
proc.send(30)
try:proc.send(None)
except StopIteration as e:print(f"计算结果: {e.value}")  # (60, 20.0)
三、大文件处理实战
  1. 多种文件读取方式对比
def read_entire_file(file_path):"""一次性读取整个文件"""with open(file_path) as f:return f.read()  # 内存杀手!def read_line_by_line(file_path):"""逐行读取文件"""with open(file_path) as f:for line in f:yield linedef read_in_chunks(file_path, chunk_size=4096):"""固定块大小读取"""with open(file_path, 'rb') as f:while chunk := f.read(chunk_size):yield chunkdef smart_reader(file_path, max_lines=1000):"""智能分块读取(自动调整块大小)"""buffer = []with open(file_path) as f:for line in f:buffer.append(line)if len(buffer) >= max_lines:yield bufferbuffer = []if buffer:yield buffer
  1. 生产级大文件处理器
class LogFileAnalyzer:"""日志文件分析器"""def __init__(self, file_path):self.file_path = file_pathself._line_count = 0self._error_count = 0def __iter__(self):"""实现迭代器协议"""with open(self.file_path, 'r', errors='replace') as f:for line in f:self._line_count += 1try:parsed = self._parse_line(line)except InvalidLogFormat:self._error_count += 1continueyield parseddef _parse_line(self, line):"""解析单行日志"""if 'ERROR' in line:return self._parse_error(line)# 其他解析逻辑...@propertydef stats(self):return {'total_lines': self._line_count,'error_lines': self._error_count}# 使用示例
analyzer = LogFileAnalyzer('server.log')
for entry in analyzer:process_log_entry(entry)
print(f"分析统计: {analyzer.stats}")
四、性能优化与高级技巧
  1. 生成器表达式优化
# 传统列表推导式(立即加载所有数据)
squares = [x**2 for x in range(1000000)]  # 占用大量内存# 生成器表达式(惰性计算)
squares_gen = (x**2 for x in range(1000000))  # 内存友好# 管道式处理
result = (x * 2 for x in squares_gen if x % 3 == 0
)
  1. 内存优化对比测试
import sysdata_list = [i for i in range(1000000)]
print(f"列表内存占用: {sys.getsizeof(data_list)/1024/1024:.2f} MB")data_gen = (i for i in range(1000000))
print(f"生成器内存占用: {sys.getsizeof(data_gen)} bytes")
  1. 异步生成器(Python 3.6+)
import aiofilesasync def async_file_reader(file_path):"""异步文件读取生成器"""async with aiofiles.open(file_path, mode='r') as f:async for line in f:  # 异步迭代yield line.strip()# 使用示例
async def process_large_file():async for line in async_file_reader('bigfile.txt'):await process_line(line)

最佳实践清单

  1. 优先使用生成器处理大型数据集
  2. 避免在生成器中修改外部状态
  3. 使用itertools模块优化迭代逻辑
  4. 对无限生成器设置安全终止条件
  5. 合理选择块大小(通常4KB-1MB)
  6. 使用yield from简化嵌套生成器
  7. 结合上下文管理器管理资源
  8. 使用类型注解提高可读性
# 带类型注解的生成器
from typing import Generator, Iteratordef countdown(n: int) -> Generator[int, None, None]:"""倒计时生成器"""while n > 0:yield nn -= 1# 使用yield from
def flatten(nested_list) -> Iterator:"""嵌套列表展开器"""for item in nested_list:if isinstance(item, (list, tuple)):yield from flatten(item)else:yield item

性能对比测试(处理1GB日志文件):

方法内存占用执行时间CPU使用率
一次性读取2.1GB12s85%
逐行读取45MB25s65%
分块读取(1MB)52MB18s78%
异步分块读取48MB15s92%
小数据
大数据
顺序处理
并行处理
异步IO
原始数据源
数据规模
使用列表直接处理
使用生成器
处理方式
普通生成器
多进程+生成器
异步生成器
结果输出

相关文章:

python基础入门:7.1迭代器与生成器

Python迭代器与生成器深度解析&#xff1a;高效处理海量数据的利器 # 大文件分块读取生成器模板 def chunked_file_reader(file_path, chunk_size1024*1024):"""分块读取大文件生成器"""with open(file_path, r, encodingutf-8) as f:while Tru…...

Docker 容器 Elasticsearch 启动失败完整排查记录

背景 在服务器上运行 Docker 容器 es3&#xff0c;但 Elasticsearch 无法正常启动&#xff0c;运行 docker ps -a 发现 es3 处于 Exited (1) 状态&#xff0c;即进程异常退出。 本次排查从错误日志、容器挂载、权限问题、SELinux 影响、内核参数等多个方面入手&#xff0c;最…...

达梦数据使用笔记

相关文档&#xff1a; 达梦官网 达梦技术文档 1.安装完成后在开始菜单中搜索DM 目录&#xff1a;C:\ProgramData\Microsoft\Windows\Start Menu\Programs\达梦数据库 下有所有相关信息 2.数据迁移 https://eco.dameng.com/document/dm/zh-cn/start/mysql_dm.html https:…...

操作系统中的任务调度算法

一、引言 在操作系统中&#xff0c;任务调度算法是核心组件之一&#xff0c;它负责合理分配有限的 CPU 资源&#xff0c;以确保系统的高效运行和良好的用户体验。任务调度的目标是实现公平性、最小化等待时间、提高系统吞吐量&#xff0c;并最大化 CPU 的利用率。不同的任务调…...

Linux 虚拟服务器(LVS)技术详解

一、LVS 概述 Linux 虚拟服务器&#xff08;Linux Virtual Server&#xff0c;简称 LVS&#xff09;是由章文嵩博士开发的一种开源的服务器集群技术&#xff0c;它工作在 Linux 内核空间&#xff0c;为构建高可用、可扩展的网络服务提供了一种高效的解决方案。LVS 可以将多个真…...

AIoT时代来临,物联网技术如何颠覆未来生活?

在这个万物互联的时代&#xff0c;“物联网”&#xff08;IoT&#xff09;正以前所未有的速度改变我们的生活&#xff0c;而“AIoT”则是在物联网基础上融入人工智能技术&#xff0c;赋予设备更高的智能和自主决策能力。随着5G、边缘计算和云技术的不断发展&#xff0c;物联网正…...

C++17 新特性解析

C++17 是 C++ 标准的一个重要更新,它在 C++11/14 的基础上引入了许多新特性,进一步简化了代码编写、提升了性能和类型安全性。以下是 C++17 的主要特性分类介绍: 一、语言核心改进 1. 结构化绑定(Structured Bindings) 允许将元组、结构体或数组的成员直接解包到变量中。…...

嵌入式软件C语言面试常见问题及答案解析(四)

嵌入式软件C语言面试常见问题及答案解析(四) 原本打算将链表相关的面试题整合到一个文档中,奈何写着写着就发现题目比较多,题型也比较丰富,所以导致上一篇已经足够长了,再长也就有点不礼貌了。 所以在这儿继续来总结分享那个面试中遇到的题目,文中的问题和提供的答案或者…...

在 C# 中,处理 Excel 和 PDF 文件的库有很多。以下是一些比较常用的选择

读取 Excel 文件的库 NPOI 用途&#xff1a;可以读取和写入 .xls 和 .xlsx 文件。特点&#xff1a;无需安装 Microsoft Office&#xff0c;支持简单的 Excel 操作&#xff0c;如格式化、公式、图表等。 EPPlus 用途&#xff1a;主要用于 .xlsx 格式&#xff08;Excel 2007 及以…...

绩效归因概述

绩效归因概述 1. 分类2. 基于净值的归因方法2.1 发展背景2.2 择时选股模型 T-M模型2.3 择时选股模型 H-M模型2.4 择时选股模型 C-L模型2.5 风格配置模型-Sharpe2.6 多因子模型 Fama-French32.7 多因子模型 Carhart42.8 多因子模型 Fama-French5 3. 基于持仓的归因方法3.1 发展背…...

Spring Boot 中加载多个 YAML 配置文件

在 Spring Boot 中加载多个 YAML 配置文件是一个常见的需求&#xff0c;通常用于将配置信息分离到多个文件中以便于管理和维护。Spring Boot 提供了灵活的方式来加载多个 YAML 配置文件。 以下是一些方法和步骤&#xff0c;用于在 Spring Boot 应用中加载多个 YAML 配置文件&a…...

厚植创新实力、聚焦生物科技:柏强制药的责任与机遇

在当今快速发展的医药行业中&#xff0c;创新已成为企业竞争的核心动力。贵州柏强制药作为医药领域的佼佼者&#xff0c;正以科技创新为引领&#xff0c;聚焦生物科技领域&#xff0c;不断突破&#xff0c;不仅为人民的健康事业贡献力量&#xff0c;更在激烈的市场竞争中抓住了…...

Linux中getifaddrs函数

文章目录 **函数原型****参数****返回值****释放资源****`struct ifaddrs` 结构****示例代码****输出示例****相关函数****总结**getifaddrs 是 Linux(以及其他 Unix-like 系统)中用于获取本机网络接口信息的系统调用。它提供了一种简单的方法来获取所有网络接口的地址信息,…...

【HarmonyOS Next 自定义可拖拽image】

效果图&#xff1a; 代码&#xff1a; import display from "ohos.display" import { AppUtil } from "pura/harmony-utils"/*** 自定义可拖拽图标组件*/ Component export default struct DraggableImage {imageResource?: ResourceimageHeight: numbe…...

解决No module named ‘llama_index.llms.huggingface‘

执行下面的脚本&#xff0c;报错No module named llama_index.llms.huggingface’执行下面的脚本&#xff0c;报错No module named llama_index.llms.huggingface’执行下面的脚本&#xff0c;报错No module named llama_index.llms.huggingface’执行下面的脚本&#xff0c;报…...

SearchBar组件的功能与用法

文章目录 1. 概念介绍2. 使用方法3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"Material3中的IconButton"相关的内容&#xff0c;本章回中将介绍SearchBar组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本…...

13.推荐系统的性能优化

接下来我们将学习推荐系统的性能优化。推荐系统的性能优化对于提升推荐结果的生成速度和系统的可扩展性至关重要&#xff0c;尤其是在处理大规模数据和高并发请求时。在这一课中&#xff0c;我们将介绍以下内容&#xff1a; 性能优化的重要性常见的性能优化方法实践示例 1. 性…...

Grafana-使用Button修改MySQL数据库

背景 众所周知&#xff0c;Grafana是一个用来展示数据的平台&#xff0c;但是有时候还是会有需求说能不能有一个按钮&#xff0c;点击的时候再对数据库进行修改&#xff0c;从而达到更新数据的效果 经过多方查证&#xff0c;终于实现了一个简单的&#xff0c;点击button执行sq…...

飞科FH6218电吹风异响维修

前言 本文仅记录一次普通的维修经历&#xff0c;解决方案也都是从网上查找资料得来&#xff0c;仅供参考&#xff0c;如有不对请指出&#xff0c;谢谢&#xff01; 现象 使用时出现异响&#xff0c;风速越大越响 参考视频 https://www.bilibili.com/video/BV1dD4y1x7hH/?…...

分治下的快速排序(典型算法思想)—— OJ例题算法解析思路

目录 一、75. 颜色分类 - 力扣(LeetCode) 运行代码: 一、算法核心思想 二、指针语义与分区逻辑 三、操作流程详解 四、数学正确性证明 五、实例推演(数组[2,0,2,1,1,0]) 六、工程实践优势 七、对比传统实现 八、潜在问题与解决方案 九、性能测试数据 十、扩展…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...