Python生成器:高效处理大数据的秘密武器

news2025/5/16 14:44:29

生成器概述

生成器是 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 遍历,如 liststrdict、迭代器、生成器
迭代器(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 i

def use_generator():
    start_time = time.time()

    gen = number_generator(10_000_000)
    squares = (x * x for x in gen)  # 生成器表达式,不会立即计算

    count = 0
    for 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)
耗时略快略慢
是否适合大数据❌ 不适合✅ 非常适合

总结

生成器是一种强大而高效的工具,特别适用于:

  • 数据量庞大的场景
  • 需要延迟加载的场景
  • 需要节省内存的场景
  • 需要简化复杂迭代逻辑的场景

虽然生成器在速度上略逊于列表,但它在内存使用上的优势使其成为处理大规模数据的首选方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2376933.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式STM32学习——继电器

继电器模块引脚说明 VCC&#xff08;&#xff09;&#xff1a; 供电正极。连接此引脚到电源&#xff08;通常是直流电源&#xff09;&#xff0c;以提供继电器线圈所需的电流。 GND&#xff08;-&#xff09;&#xff1a; 地。连接此引脚到电源的负极或地。 IN&#xff08;或…

从基础到实习项目:C++后端开发学习指南

在当今技术快速迭代的背景下&#xff0c;后端开发作为软件工程的核心支柱持续发挥着关键作用。C凭借其卓越的性能表现和系统级控制能力&#xff0c;依然是构建高性能后端服务的首选语言之一。本文将系统性地解析现代C后端开发的核心技术体系&#xff0c;包括从语言特性精要到架…

Xinference推理框架

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

前端ECS简介

ECS概念 ECS是一种软件架构模式&#xff0c;常见于游戏业务场景&#xff0c;其主要对象分类为 • Entity 实体,ECS架构中所有的业务对象都必须拥有一个唯一的Entity实体 • Component 组件,存储着数据结构,对应着某一种业务属性,一个Entity上可以动态挂载多个Component • …

Dify与n8n全面对比指南:AI应用开发与工作流自动化平台选择【2025最新】

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

【深度学习之四】知识蒸馏综述提炼

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

redis解决常见的秒杀问题

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

TypeScript中文文档

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

Function Calling

在介绍Function Calling之前我们先了解一个概念,接口。 接口 两种常见接口: 人机交互接口,User Interface,简称 UI应用程序编程接口,Application Programming Interface,简称 API接口能「通」的关键,是两边都要遵守约定。 人要按照 UI 的设计来操作。UI 的设计要符合人…

面试--HTML

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

SparkSQL操作Mysql-准备mysql环境

我们计划在hadoop001这台设备上安装mysql服务器&#xff0c;&#xff08;当然也可以重新使用一台全新的虚拟机&#xff09;。 以下是具体步骤&#xff1a; 使用finalshell连接hadoop001.查看是否已安装MySQL。命令是: rpm -qa|grep mariadb若已安装&#xff0c;需要先做卸载MyS…

DeepBook 与 CEX 的不同

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

Scrapy框架下地图爬虫的进度监控与优化策略

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

城市扫街人文街头纪实胶片电影感Lr调色预设,DNG/手机适配滤镜!

调色详情 城市扫街人文街头纪实胶片电影感 Lr 调色是通过 Lightroom&#xff08;Lr&#xff09;软件&#xff0c;对城市街头抓拍的人文纪实照片进行后期调色处理。旨在赋予照片如同胶片拍摄的质感以及电影般浓厚的叙事氛围&#xff0c;不放过每一个日常又珍贵的瞬间&#xff0c…

让AI帮我写一个word转pdf的工具

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

OrangePi Zero 3学习笔记(Android篇)10 - SPI和从设备

目录 1. 配置内核 2. 修改设备数 3. 修改权限 4. 验证 Zero 3的板子有2个SPI Master接口&#xff0c;其中SPI0接的是板载16MB大小的SPI Nor Flash&#xff0c;SPI1则是导出到26pin的接口上。 spi和i2c有点不同&#xff0c;spi是直接生成spi虚拟设备&#xff0c;所以在dev里…

基于策略的强化学习方法之近端策略优化(PPO)深度解析

PPO&#xff08;Proximal Policy Optimization&#xff09;是一种基于策略梯度的强化学习算法&#xff0c;旨在通过限制策略更新幅度来提升训练稳定性。传统策略梯度方法&#xff08;如REINFORCE&#xff09;直接优化策略参数&#xff0c;但易因更新步长过大导致性能震荡或崩溃…

文章复现|(1)整合scRNA-seq 和空间转录组学揭示了子宫内膜癌中 MDK-NCL 依赖性免疫抑制环境

https://www.frontiersin.org/journals/immunology/articles/10.3389/fimmu.2023.1145300/full 目标&#xff1a;肿瘤微环境(TME)在子宫内膜癌(EC)的进展中起着重要作用。我们旨在评估EC的TME中的细胞群体。 方法&#xff1a;我们从GEO下载了EC的单细胞RNA测序(scRNA-seq)和空…

HTML-3.4 表单form

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

【MySQL】服务器配置与管理(相关日志)

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【MySQL】探秘&#xff1a;数据库世界的瑞士军刀 一、系统变量和选项 当通过mysqld启动数据库服务器时&#xff0c;可以通过选项文件或命令行中提供选项。一般&#xff0c;为了确保服务器在每次运行时…