Python生成器:高效处理大数据的秘密武器
生成器概述
生成器是 Python 中的一种特殊迭代器,通过普通函数的语法实现,但使用 yield
语句返回数据。生成器自动实现了 __iter__()
和 __next__()
方法,因此可以直接用于迭代。生成器的核心特点是延迟计算(lazy evaluation),即只在需要时生成下一个值,而不是一次性计算并存储所有值。
生成器的作用与优势
作用:
- 节省内存空间
- 按需生成数据项
- 支持无限序列生成
- 简化复杂迭代逻辑的代码
优势:
- 内存效率高,适用于大数据集
- 可以创建惰性求值的数据流
- 代码结构更加简洁易读
生成器的使用场景
场景 | 描述 |
---|---|
处理大数据集 | 当数据量非常大以至于无法全部加载到内存中时,生成器可以逐个生成数据项 |
创建无限序列 | 如自然数列、斐波那契数列等理论上没有终点的数据流 |
简化代码结构 | 在某些情况下,使用生成器可以让代码更加简洁、易维护 |
生成器表达式 vs 列表推导式
类型 | 语法 | 是否立即执行 | 示例 | 特点 |
---|---|---|---|---|
列表推导式 | 使用方括号 [] | ✅ 是 | [i * 5 for i in range(5)] | 立即计算结果并保存在内存中 |
生成器表达式 | 使用圆括号 () | ❌ 否 | (i * 5 for i in range(5)) | 延迟计算,每次迭代才会生成一个值 |
示例代码:
li = [i * 5 for i in range(5)]
print(li) # 输出: [0, 5, 10, 15, 20]gen = (i * 5 for i in range(5))
print(gen) # 输出: <generator object ...>
print(gen.__next__()) # 输出: 0
生成器函数:yield 的作用
带有 yield
关键字的函数称为生成器函数。它不像普通函数那样返回一个值后就结束,而是可以在多个调用之间“暂停”和“恢复”。类似于中断函数。
yield 的特点:
- 每次调用
next()
会从上次yield
的位置继续执行 - 保留函数的状态
- 返回值不会被一次性计算出来,而是按需生成
示例代码:
def test():yield 'a'yield 'b'yield 'c'gen = test()
print(gen.__next__()) # 输出: a
print(gen.__next__()) # 输出: b
print(gen.__next__()) # 输出: c
可迭代对象、迭代器、生成器三者关系
名称 | 定义 | 特点 |
---|---|---|
可迭代对象(Iterable) | 实现了 __iter__() 方法的对象 | 可以用 for...in 遍历,如 list 、str 、dict 、迭代器、生成器 |
迭代器(Iterator) | 实现了 __next__() 方法的对象 | 可以使用 next() 获取下一个元素 |
生成器(Generator) | 一种特殊的迭代器,由 yield 函数或生成器表达式产生 | 自动实现 __iter__() 和 __next__() |
三者关系图示:
- 可迭代对象包含迭代器迭代器包含生成器
可迭代对象 ⊃ 迭代器 ⊃ 生成器
实战对比:列表 vs 生成器处理大数据
比较两种方式处理一千万个数字(0~9999999),并对每个数字进行平方操作。
使用模块:
time
:用于计时sys
:用于查看内存占用
代码如下:
import time
import sys# 方法一:使用列表
def use_list():start_time = time.time()numbers = [i for i in range(10_000_000)] # 生成列表squares = [x * x for x in numbers] # 计算平方end_time = time.time()print(f"【列表】耗时: {end_time - start_time:.4f} 秒")print(f"【列表】占用内存: {sys.getsizeof(numbers) + sys.getsizeof(squares)} 字节")# 方法二:使用生成器
def number_generator(n):for i in range(n):yield idef use_generator():start_time = time.time()gen = number_generator(10_000_000)squares = (x * x for x in gen) # 生成器表达式,不会立即计算count = 0for square in squares:count += 1 # 强制执行生成器end_time = time.time()print(f"【生成器】耗时: {end_time - start_time:.4f} 秒")print(f"【生成器】生成器对象本身占用内存: {sys.getsizeof(gen)} 字节")# 运行测试
print("=== 开始测试 ===\n")
use_list()
print("\n------------------------\n")
use_generator()
print("\n=== 测试结束 ===")
结果分析(根据机器性能不同,数值可能略有差异):
指标 | 列表方式 | 生成器方式 |
---|---|---|
内存占用 | 非常大(约 184MB) | 极小(约 112B) |
耗时 | 略快 | 略慢 |
是否适合大数据 | ❌ 不适合 | ✅ 非常适合 |
总结
生成器是一种强大而高效的工具,特别适用于:
- 数据量庞大的场景
- 需要延迟加载的场景
- 需要节省内存的场景
- 需要简化复杂迭代逻辑的场景
虽然生成器在速度上略逊于列表,但它在内存使用上的优势使其成为处理大规模数据的首选方式。
相关文章:
Python生成器:高效处理大数据的秘密武器
生成器概述 生成器是 Python 中的一种特殊迭代器,通过普通函数的语法实现,但使用 yield 语句返回数据。生成器自动实现了 __iter__() 和 __next__() 方法,因此可以直接用于迭代。生成器的核心特点是延迟计算(lazy evaluation&…...
React Native/Flutter 原生模块开发
以下是关于 React Native 和 Flutter 原生模块开发的基本知识点总结: 一、核心概念对比 维度React NativeFlutter架构基础JavaScriptCore/Hermes + Bridge/TurboModulesDart VM + Skia引擎原生交互方式Native Modules + Native UI ComponentsPlatform Channels + Platform Vie…...

嵌入式STM32学习——继电器
继电器模块引脚说明 VCC(): 供电正极。连接此引脚到电源(通常是直流电源),以提供继电器线圈所需的电流。 GND(-): 地。连接此引脚到电源的负极或地。 IN(或…...

从基础到实习项目:C++后端开发学习指南
在当今技术快速迭代的背景下,后端开发作为软件工程的核心支柱持续发挥着关键作用。C凭借其卓越的性能表现和系统级控制能力,依然是构建高性能后端服务的首选语言之一。本文将系统性地解析现代C后端开发的核心技术体系,包括从语言特性精要到架…...
AI软件汇总与功能解析:赋能未来的智能工具库
人工智能(AI)技术的快速发展催生了大量功能强大的软件工具,覆盖自然语言处理、计算机视觉、数据分析、自动化决策等多个领域。本文将汇总当前主流的AI软件,并解析其核心功能与应用场景,为企业和开发者提供参考指南。 一…...

Xinference推理框架
概述 GitHub,官方文档。 核心优势 性能优化:通过vLLM、SGLang等引擎实现低延迟推理,吞吐量提升2-3倍;企业级支持:支持分布式部署、国产硬件适配及模型全生命周期管理;生态兼容:无缝对接LangC…...

前端ECS简介
ECS概念 ECS是一种软件架构模式,常见于游戏业务场景,其主要对象分类为 • Entity 实体,ECS架构中所有的业务对象都必须拥有一个唯一的Entity实体 • Component 组件,存储着数据结构,对应着某一种业务属性,一个Entity上可以动态挂载多个Component • …...
ET ProcessOuterSender类(实体) 分析
ProcessOuterSender 夸进程发送Actor消息,只在NetInner(Scene)使用。 字段 TIMEOUT_TIME RPC超时时间RpcId rpcIdrequestCallback 存储RPC的回调事件AService 进程之间的网络服务InnerProtocol 内部网络协议类型 目前固定KCP 方法 OnRead 方法,收包…...
redis中key的过期和淘汰
一、过期(redis主动删除) 设置了ttl过期时间的key,在ttl时间到的时候redis会删除过期的key。但是redis是惰性过期。惰性过期:redis并不会立即删除过期的key,而是会在获取key的时候判断key是否过期,如果发现…...

Dify与n8n全面对比指南:AI应用开发与工作流自动化平台选择【2025最新】
Dify与n8n全面对比指南:AI应用开发与工作流自动化平台选择【2025最新】 随着AI技术与自动化工具的迅速发展,开发者和企业面临着多种平台选择。Dify和n8n作为两个备受关注的自动化平台,分别专注于不同领域:Dify主要面向AI应用开发&…...

【深度学习之四】知识蒸馏综述提炼
知识蒸馏综述提炼 目录 知识蒸馏综述提炼 前言 参考文献 一、什么是知识蒸馏? 二、为什么要知识蒸馏? 三、一点点理论 四、知识蒸馏代码 总结 前言 知识蒸馏作为一种新兴的、通用的模型压缩和迁移学习架构,在最近几年展现出蓬勃的活力…...

redis解决常见的秒杀问题
title: redis解决常见的秒杀问题 date: 2025-03-07 14:24:13 tags: redis categories: redis的应用 秒杀问题 每个店铺都可以发布优惠券,保存到 tb_voucher 表中;当用户抢购时,生成订单并保存到 tb_voucher_order 表中。 订单表如果使用数据…...

TypeScript中文文档
最近一直想学习TypeScript,一直找不到一个全面的完整的TypeScript 中文文档。在网直上找了了久,终于找到一个全面的中文的typescript中文学习站,有学习ts的朋友可以年。 文档地址:https://typescript.uihtm.com 该TypeScript 官…...

Function Calling
在介绍Function Calling之前我们先了解一个概念,接口。 接口 两种常见接口: 人机交互接口,User Interface,简称 UI应用程序编程接口,Application Programming Interface,简称 API接口能「通」的关键,是两边都要遵守约定。 人要按照 UI 的设计来操作。UI 的设计要符合人…...
【搭建Node-RED + MQTT Broker实现AI大模型交互】
搭建Node-RED MQTT Broker实现AI大模型交互 搭建Node-RED MQTT Broker实现AI大模型交互一、系统架构二、环境准备与安装1. 安装Node.js2. 安装Mosquitto MQTT Broker3. 配置Mosquitto4. 安装Node-RED5. 配置Node-RED监听所有网络接口6. 启动Node-RED 三、Node-RED流程配置1. …...
高可靠低纹波国产4644电源芯片在工业设备的应用
摘要 随着工业自动化和智能化的飞速发展,工业设备对于电源芯片的性能和可靠性提出了前所未有的严格要求。电源芯片作为工业设备的核心供电组件,其性能直接影响到整个设备的运行效率和稳定性。本文以国科安芯的ASP4644四通道降压稳压器为例,通…...

面试--HTML
1.src和href的区别 总结来说: <font style"color:rgb(238, 39, 70);background-color:rgb(249, 241, 219);">src</font>用于替换当前元素,指向的资源会嵌入到文档中,例如脚本、图像、框架等。<font style"co…...

SparkSQL操作Mysql-准备mysql环境
我们计划在hadoop001这台设备上安装mysql服务器,(当然也可以重新使用一台全新的虚拟机)。 以下是具体步骤: 使用finalshell连接hadoop001.查看是否已安装MySQL。命令是: rpm -qa|grep mariadb若已安装,需要先做卸载MyS…...
Linux常用方法
1、查看日志后100行 tail -f -n 100 catalina.out 2、ps命令 ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照 ps -ef 显示所有进程信息,连同命令行,ps 与grep 常用组合用法,查找特定进程 ps aux列出目前所有的…...
[c++项目]云备份项目测试
1. 测试概述 测试时间:2024年3月 测试环境:macOS 23.4.0 测试工具:VSCode, CMake, GTest 2. 功能测试 2.1 文件备份功能 测试项预期结果实际结果状态单文件备份成功上传并保存成功✅多文件备份批量上传成功成功✅大文件备份分片上传成功…...

DeepBook 与 CEX 的不同
如果你曾经使用过像币安或 Coinbase 这样的中心化交易所(CEX),你可能已经熟悉了订单簿系统 — — 这是一种撮合买卖双方进行交易的机制。而 DeepBook 是 Sui 上首个完全链上的中央限价订单簿。 那么,是什么让 DeepBook 如此独特&…...

Scrapy框架下地图爬虫的进度监控与优化策略
1. 引言 在互联网数据采集领域,地图数据爬取是一项常见但具有挑战性的任务。由于地图数据通常具有复杂的结构(如POI点、路径信息、动态加载等),使用传统的爬虫技术可能会遇到效率低下、反爬策略限制、任务进度难以监控等问题。 …...

城市扫街人文街头纪实胶片电影感Lr调色预设,DNG/手机适配滤镜!
调色详情 城市扫街人文街头纪实胶片电影感 Lr 调色是通过 Lightroom(Lr)软件,对城市街头抓拍的人文纪实照片进行后期调色处理。旨在赋予照片如同胶片拍摄的质感以及电影般浓厚的叙事氛围,不放过每一个日常又珍贵的瞬间,…...
嵌入式学习笔记 D21:双向链表的基本操作
双向链表的定义与创建双向链表的插入双向链表的查找双向链表的修改双向链表的删除双向链表的逆序MakeFile工具使用 一、双向链表的定义与创建 1.双向链表的定义: 双向链表是在单链表的每个结点中,再设置一个指向其前一个结点的指针域。 struct DOUNode…...

让AI帮我写一个word转pdf的工具
需求分析 前几天,一个美女找我: 阿瑞啊,能不能帮我写个工具,我想把word文件转为pdf格式的 我说:“你直接网上搜啊,网上工具多了去了” 美女说: 网上的要么是需要登录注册会员的,要…...

OrangePi Zero 3学习笔记(Android篇)10 - SPI和从设备
目录 1. 配置内核 2. 修改设备数 3. 修改权限 4. 验证 Zero 3的板子有2个SPI Master接口,其中SPI0接的是板载16MB大小的SPI Nor Flash,SPI1则是导出到26pin的接口上。 spi和i2c有点不同,spi是直接生成spi虚拟设备,所以在dev里…...

基于策略的强化学习方法之近端策略优化(PPO)深度解析
PPO(Proximal Policy Optimization)是一种基于策略梯度的强化学习算法,旨在通过限制策略更新幅度来提升训练稳定性。传统策略梯度方法(如REINFORCE)直接优化策略参数,但易因更新步长过大导致性能震荡或崩溃…...
跨境电商定价革命:亚马逊“逆向提价“策略背后的价值重构逻辑
导言:打破价格魔咒的销量奇迹 2024年Q3亚马逊平台上演商业悖论:在TOP5000卖家中,12%实施5%-15%温和提价的商户,41%实现单量30.4%的季度增长。这一现象颠覆"低价即流量"的电商铁律,揭开新消费时代"价值定…...

文章复现|(1)整合scRNA-seq 和空间转录组学揭示了子宫内膜癌中 MDK-NCL 依赖性免疫抑制环境
https://www.frontiersin.org/journals/immunology/articles/10.3389/fimmu.2023.1145300/full 目标:肿瘤微环境(TME)在子宫内膜癌(EC)的进展中起着重要作用。我们旨在评估EC的TME中的细胞群体。 方法:我们从GEO下载了EC的单细胞RNA测序(scRNA-seq)和空…...

HTML-3.4 表单form
本系列可作为前端学习系列的笔记,代码的运行环境是在HBuilder中,小编会将代码复制下来,大家复制下来就可以练习了,方便大家学习。 系列文章目录 HTML-1.1 文本字体样式-字体设置、分割线、段落标签、段内回车以及特殊符号 HTML…...