当前位置:

首页 > 编程开发 > Python怎样避免在循环中不断追加数据_预分配列表收集后统一转换为DF

Python怎样避免在循环中不断追加数据_预分配列表收集后统一转换为DF

本文目录

    循环中append()变慢源于列表扩容机制和垃圾回收压力。预分配列表可提升性能:已知长度用[None]*n赋值,未知长度用列表推导式。转换为DataFrame时推荐list[tuple]或list[list],显式指定columns。若需动态判断则不宜预分配。

    这段代码揭示了一个很经典的问题——在循环里不断用 append() 往列表里塞东西,跑着跑着突然变慢,尤其是在处理几万甚至几十万行数据的时候。很多人都遇到过这个场景,第一反应是“是不是 append() 本身效率有问题?”但从底层实现来看,真正的原因可能和你想的不太一样。

    Python怎样避免在循环中不断追加数据_预分配列表收集后统一转换为DF

    为什么循环中 append() 会变慢?

    关键问题不在于 append() 这个操作本身有多慢,而是 Python 列表在容量不足时,会触发一次扩容机制。CPython 的实现里,每次扩容大约是 1.125 倍——意思是当当前容量不够用了,解释器会重新申请一块更大的内存空间,然后把旧元素一个个拷贝过去。假设你循环了几万次,扩容可能发生几十次,每次拷贝都伴随着内存分配的开销。累计下来的耗时,早就不是线性增长那么简单了。

    还有一个更隐蔽的陷阱:如果循环体里还顺手做了字符串拼接、字典构造、或者临时对象的创建,这些操作会显著增加垃圾回收的压力。GC 被频繁唤醒,整体执行节奏自然就被拖慢了。

    预分配列表的两种可靠做法

    预分配的前提是你得提前知道最终要装多少东西。如果能确定行数——比如遍历一个固定长度的 range、zip、或者读一个已知行数的 CSV——直接上 [None] * n 是最省事的做法。如果长度未知但逻辑上可以推导出来,列表推导式是更好的选择,解释器会在内部自动优化成一次预分配加逐行填充,比手动 append() 快得多,也更符合 Python 的风格。

    • 已知长度 n:results = [None] * n,然后 results[i] = (x, y, z) 直接按索引赋值
    • 逻辑明确但长度未知:直接上列表推导式,比如 [(f(x), g(x)) for x in data]
    • 特别提醒:别用 [[0] * n] 这种写法——它生成的其实是同一个子列表的多个引用,你改一个,其他全跟着变,后果可想而知

    从预分配列表到 DataFrame 的高效转换

    pd.DataFrame() 这个构造函数有“脾气”,不同输入结构的性能表现天差地别。tuple 列表或 list 列表速度最快;如果传的是 dict 列表,pandas 需要额外做字段对齐,开销就上去了;要是用 pd.concat 拼接多个 Series,性能会断崖式下跌。

    • 推荐的做法:预分配成 list[tuple] 或 list[list],并且保证列的顺序与目标 DataFrame 的列名严格一致
    • 构造时显式指定 columns=,否则 pandas 在遇到混合类型数据时容易自动推成 object,后续计算容易出问题
    • 如果原始数据里混了一堆 None 或 np.nan,建议构造完后立刻用 df.astype(...) 显式设定 dtype,防止后续操作意外把整列升格成 object
    data = [None] * len(items)for i, item in enumerate(items):    data[i] = (item.id, item.name, item.score)df = pd.DataFrame(data, columns=['id', 'name', 'score'])

    什么情况下不该预分配?

    预分配不是万能的。如果你的循环逻辑里需要动态判断“要不要追加”——比如过滤、异常跳过、嵌套条件——硬套预分配只会让代码变得又难读又容易出错。你得额外维护一个计数器,处理那些没填数据的空位,最后还得手动切片去掉 None。代价太大了。

    这种情况下,更务实的做法是老老实实用 append(),但把构造 DataFrame 的动作拖到循环结束之后一次性完成。关键是要确保收集到的数据结构统一、类型稳定,别搞出“dict 里面嵌套 list 里面再套 tuple”这种混乱结构。

    说实话,真正影响性能的从来不是 append 这一行代码,而是数据结构混乱、类型不稳定、以及多余的中间转换。与其死盯着预分配不放,不如先检查一下你的 data 列表里每个元素是不是长得一模一样。

    本文内容来源于网友投稿,如有侵权请联系删除。
    作者最新文章
    编程开发 Python
    相关文章 更多
    PHP递归性能优化技巧与迭代替代方案
    PHP递归性能优化技巧与迭代替代方案

    解析PHP递归函数在树形数据处理中的性能瓶颈,提供预加载数据消除I/O、使用显式栈替代深层递归的实战方案,帮助开发者在代码可读性与执行效率间做出合理取舍。

    Java测试中怎么使用Mockito模拟依赖对象
    Java测试中怎么使用Mockito模拟依赖对象

    详细讲解在Java单元测试中如何使用Mockito模拟依赖对象,包括引入依赖、创建Mock、打桩返回值、行为验证以及Mock与Spy的核心差异和常见陷阱排查。

    链表删除节点的时间复杂度是多少及其详细分析
    链表删除节点的时间复杂度是多少及其详细分析

    详细分析链表删除节点的时间复杂度,深入探讨单链表与双向链表在不同已知前提下的查找与删除开销,并结合完整代码与清晰图解进行对比总结。

    codex如何配置模型参数及文件设置教程
    codex如何配置模型参数及文件设置教程

    想知道如何让AI写出的代码更贴合你的习惯?本文手把手教你在VS Code中调整Codex相关模型参数,通过修改配置文件优化温度值和令牌限制,解决代码建议不准确或响应慢的问题。

    Claude Code AI编程工具实力揭秘与编程助手实测
    Claude Code AI编程工具实力揭秘与编程助手实测

    通过实测展示Claude Code在终端中如何理解自然语言指令、自动修改代码文件并处理复杂编程任务,帮助开发者评估其实际辅助能力。

    winforms教程自学入门与基础开发步骤详解
    winforms教程自学入门与基础开发步骤详解

    本教程详细讲解如何使用Visual Studio创建WinForms项目,通过添加按钮和标签控件并编写点击事件代码,实现一个基础的计数器功能,适合C#初学者快速上手Windows窗体应用开发。

    Cursor自动补全设置教程教你快速开启代码补全功能
    Cursor自动补全设置教程教你快速开启代码补全功能

    详解Cursor编辑器中自动补全功能的开启与优化设置,涵盖Tab触发机制、上下文窗口调整及模型切换,帮助开发者解决补全延迟、干扰大等问题,提升编码流畅度。

    pandas的数据格式怎么转换和设置方法教程
    pandas的数据格式怎么转换和设置方法教程

    详解Pandas中数据格式转换的核心方法,包括astype强制转换、to_numeric容错处理及日期解析技巧,解决常见类型错误并提升数据处理效率。

    VS Code中文设置方法 简体语言包安装与切换教程
    VS Code中文设置方法 简体语言包安装与切换教程

    详细介绍在Visual Studio Code中安装Chinese (Simplified)语言包的方法,包括通过扩展市场搜索、安装及自动重启切换至简体中文界面的完整步骤,帮助开发者快速将编辑器本地化。

    cursor安装过程无法更改安装位置的解决方法
    cursor安装过程无法更改安装位置的解决方法

    针对Cursor安装包默认锁定C盘且无路径选择界面的问题,提供通过手动移动文件并创建目录联结(Symbolic Link)的解决方案,实现将软件安装在其他磁盘分区。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    macOS软件
    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    Mac软件 更多
    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

    灵活计算器
    灵活计算器
    macOS/iOS/Android

    灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

    WINDOWS 更多
    3dmax(3ds max)
    3dmax(3ds max)
    Windows

    Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。