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

python 内存管理 内存泄漏及排查方案 内存友好的python代码

Python 内存管理一、一句话总结Python 的内存管理就是三件事自动分配内存你不用管变量存在哪自动回收垃圾不用的对象自动删掉靠引用计数 分代垃圾回收实现二、核心机制 1引用计数最基础是什么每个对象都有一个引用计数器记录有多少个变量指向它。规则变量指向它 →计数 1变量不再指向它 →计数 -1计数 0→立刻被回收内存释放例子a[1,2,3]# 引用计数 1ba# 引用计数 2dela# 引用计数 1delb# 引用计数 0 → 立即回收优点实时性高不用的对象马上释放内存缺点无法解决循环引用这是最大弱点三、核心机制 2垃圾回收GC解决循环引用什么是循环引用a[]b[]a.append(b)b.append(a)a 引用 bb 引用 a → 互相引用谁也不释放。引用计数永远不会变成 0 → 内存泄漏所以 Python 引入GC垃圾回收专门清理这种情况。四、核心机制 3分代回收GC 工作方式Python 把对象分成 3 代0 代新创建的对象扫描最频繁1 代活过一次GC2 代活得很久的对象扫描最少规则活得越久越不可能被删越新的对象越容易死越要频繁检查效率极高五、内存池机制提升速度Python 不会每次都向操作系统要内存而是自己维护一个内存池小块内存 → 从内存池拿用完归还内存池避免频繁申请/释放速度快很多六、完整流程面试必背创建对象 → 自动分配内存用引用计数跟踪对象被使用次数计数0 →立即释放遇到循环引用→GC分代回收清理小内存使用内存池提升效率七、一句话总结Python 内存管理以引用计数为基础负责实时回收对象通过分代垃圾回收解决循环引用问题并使用内存池减少内存开销提升效率。Python 内存泄漏 排查方案面试实战一、先懂什么是内存泄漏本该被销毁的对象引用一直没断开GC回收不掉内存只涨不跌常见原因循环引用没断干净全局变量一直持有大对象长连接/缓存无限堆积不清空线程、定时器、事件监听忘记关闭第三方库/对象手动内存不释放二、最常见 3 种泄漏场景1. 循环引用引用计数失效a[]b[]a.append(b)b.append(a)# 互相引用计数永远不为0老版本极易泄漏现在Python3 GC能自动清理但大量批量循环引用依旧会卡、占内存2. 全局变量常驻内存cache_list[]# 全局列表defadd_data():foriinrange(100000):cache_list.append([i]*100)# 无限塞永不清空程序运行越久内存越大3. 类实例/闭包持续持有引用deffunc():big_datalist(range(1000000))definner():print(len(big_data))returninner ffunc()# inner闭包一直持有big_data无法释放三、4 大排查工具由简到难1. 内置模块 gc 查看回收情况importgc# 开启调试打印回收详情gc.set_debug(gc.DEBUG_LEAK)# 手动触发垃圾回收gc.collect()# 查看未被回收的泄漏对象print(gc.garbage)gc.garbage里有内容 确定存在泄漏对象2. psutil 实时监控进程内存importpsutilimportosdefget_memory():pidos.getpid()ppsutil.Process(pid)# 单位 MBreturnp.memory_info().rss/1024/1024print(get_memory())循环运行代码观察内存持续上涨不回落泄漏实锤3. objgraph 定位泄漏对象最常用安装pipinstallobjgraph用法importobjgraph# 查看数量最多的对象objgraph.show_most_common_types(limit20)# 查看某个对象的引用链找到是谁还在持有objgraph.show_backrefs(objgraph.find_backref_chain(泄漏对象))直接追踪谁在死死抓住这个对象不放4. memory_profiler 逐行分析内存安装pipinstallmemory-profiler用法frommemory_profilerimportprofileprofiledeftest():# 你的业务代码passtest()运行后逐行显示每行占用内存精准定位爆内存代码四、解决内存泄漏 6 个实用方案主动断开引用不用对象手动赋值Nonebig_dataNone用完及时 del 删除dela,b清空全局缓存/列表cache_list.clear()避免闭包长期持有大对象用完主动解绑手动触发GC定时执行importgc gc.collect()改用弱引用 weakref不想强持有用弱引用不影响回收importweakref objweakref.proxy(原对象)五、面试标准回答Python内存泄漏大多由循环引用、全局常驻对象、闭包强引用、资源未释放导致排查可使用gc模块查看垃圾对象、psutil监控进程内存、objgraph追踪引用链、memory_profiler逐行分析解决方式主动置空引用、及时删除对象、定期清理缓存、使用弱引用、手动触发垃圾回收。六、速记口诀内存只涨不回落大概率是引用锁循环引用全局存闭包持有甩不脱gc查垃圾psutil看涨跌objgraph追源头。如何写出内存友好的 Python 代码谨慎使用全局变量 全局变量通常会进入 GC 的第 2 代长期霸占内存。能放在函数内部的局部变量就不要放在全局。避免死结般的循环引用 如果在设计树状结构或图结构时不可避免地遇到双向引用比如父节点指向子节点子节点又指向父节点请使用标准库中的 weakref弱引用模块。弱引用不会增加对象的引用计数。处理海量数据时使用生成器 如上一篇文章所说生成器按需产出数据不会一次性撑爆内存池。手动触发 GC必要时 在跑完一个极消耗内存的数据清洗脚本后可以通过 import gc; gc.collect() 强制执行一次全量垃圾回收清理内存碎片。深入底层才能在架构和性能优化时游刃有余。Python 绝不仅仅是简单的脚本语言它的内部设计同样充满了权衡与智慧。一、核心原则少创建、晚创建、及时释放、按需加载、避免常驻二、变量与对象优化不用就置空 / del 销毁# 用完大对象立刻解绑large_dataNonedellarge_data优先局部变量少用全局变量全局变量生命周期贯穿整个程序长期占内存局部函数执行完自动释放。避免无意识创建临时大对象# 差生成完整新列表new_list[x*2forxinbig_list]# 好用生成器不占整块内存gen(x*2forxinbig_list)小数据复用对象减少频繁新建循环内不要反复创建大容器提前初始化复用。三、容器选型最关键海量遍历优先用 生成器 / 迭代器列表一次性载入全量数据生成器边用边生成几乎不占内存# 占内存numslist(range(10000000))# 内存友好numsrange(10000000)大量键值存储按需选结构普通字典够用就不用嵌套多层字典固定结构数据用namedtuple/dataclass更省内存数值矩阵优先numpy 数组比原生列表省超多内存大列表及时清空data_list.clear()四、循环写法优化避免循环内嵌套循环生成大中间数据遍历优先 for-in 迭代不要先切片复制# 浪费复制一份新列表foriteminarr[:]:pass# 友好直接遍历原数组foriteminarr:pass分批处理大数据不要一次性全读入文件、日志、数据库数据分页/分块读取而非一次性加载到内存。五、字符串优化大量拼接不用频繁字符串拼接不断新建对象改用列表收集最后join# 差sforiinrange(1000):sstr(i)# 优tmp[]foriinrange(1000):tmp.append(str(i))s.join(tmp)六、资源与IO内存优化文件、网络连接、数据库连接用完必关闭优先with上下文管理器自动释放资源withopen(test.txt,r,encodingutf-8)asf:textf.readline()# 出作用域自动关闭释放日志、缓存设置上限自动淘汰缓存字典/列表加最大长度超出自动丢弃旧数据防止无限膨胀。七、面向对象写法优化类属性少存冗余数据实例只存必要字段冗余计算属性用property动态计算不常驻内存慎用闭包长期捕获大对象闭包会强引用外层大变量导致无法GC回收需要弱关联用 weakref 弱引用不想阻碍垃圾回收使用弱引用不增加引用计数八、GC 与内存回收优化批量处理完数据后手动触发垃圾回收importgc gc.collect()减少循环引用代码写法从源头规避内存泄漏九、第三方库内存技巧Pandas读取csv指定usecols只读取需要列调低数值类型int64→int32、float64→float32图像处理处理完图像数组及时销毁不要全局常驻大图矩阵十、极简背诵总结面试直接说多用生成器迭代器替代列表分批加载大数据优先局部变量严控全局大对象常驻内存资源使用with自动释放用完及时置空删除对象字符串拼接用列表join避免频繁新建字符串精简类实例属性减少冗余存储必要时使用弱引用大数据分页分块处理杜绝一次性全量载入内存。内存友好代码 VS 耗内存代码 对照表一、大数据遍历耗内存写法内存友好写法优势data list(range(10000000))data range(10000000)不生成完整列表迭代取值几乎无内存占用列表推导式[x*2 for x in arr]生成器表达式(x*2 for x in arr)边遍历边计算不存全部结果二、变量作用域耗内存友好写法全局定义大列表/大字典放到函数内作为局部变量长期保留无用大对象del obj/obj None三、循环遍历低效写法优化写法for i in arr[:]:切片复制for i in arr:直接遍历循环内频繁创建空列表外部提前创建循环内清空复用四、字符串拼接浪费内存高效写法s str(i)循环累加列表收集 .join()五、文件读取耗内存友好写法f.read()一次性读整文件for line in f:逐行读取不手动关闭文件with open() as f:上下文管理器六、容器存储笨重写法轻量化写法多层嵌套字典存结构化数据namedtuple/dataclass纯Python列表存海量数值numpy.array统一存储列表无限追加不限制设置最大长度自动清理旧数据七、数据处理错误写法正确写法一次性读取全量数据库数据分页查询、分批拉取图像处理后全局保存原图用完立即销毁图像数组八、引用优化容易泄漏优化方案闭包捕获超大外层变量执行完毕手动解绑变量大量对象强引用绑定weakref弱引用九、垃圾回收放任不管主动优化依赖系统自动GC大批量数据处理后gc.collect()大量循环引用代码重构逻辑减少互相引用十、Pandas专属优化高内存省内存读取所有列usecols指定只读取需要列默认int64/float64向下转型 int32、float32通用极简守则能迭代不存全量能局部不全局能复用不新建能清空不堆积资源用完必释放大对象用完必解绑分批处理大数据拒绝一次性塞满内存

相关文章:

python 内存管理 内存泄漏及排查方案 内存友好的python代码

Python 内存管理 一、一句话总结 Python 的内存管理就是三件事: 自动分配内存(你不用管变量存在哪)自动回收垃圾(不用的对象自动删掉)靠引用计数 分代垃圾回收实现二、核心机制 1:引用计数(最基…...

解锁.NET 11 新境:ASP.NET Core 10 在微服务安全通信的深化与实践

解锁.NET 11 新境:ASP.NET Core 10 在微服务安全通信的深化与实践 前言 在当今分布式系统盛行的时代,微服务架构已成为构建大型应用的主流选择。ASP.NET Core 10 作为.NET 11 生态中重要的后端框架,为微服务间的安全通信提供了全面且强大的支…...

为什么你的ElevenLabs马来文输出总像“机器人朗读”?资深语音架构师拆解4层韵律建模断层与3个修复级prompt模板

更多请点击: https://intelliparadigm.com 第一章:为什么你的ElevenLabs马来文输出总像“机器人朗读”?资深语音架构师拆解4层韵律建模断层与3个修复级prompt模板 马来语(Bahasa Melayu)虽属声调中性语言,…...

【AI入门知识点】Skills 是什么?终于有人把 Skills、Function Calling、MCP 讲明白了

为什么现在 AI 会查天气?为什么 AI 能读 Excel、操作浏览器、发邮件?为什么很多人说:未来 AI 拼的不是谁更聪明,而是谁 Skills 更多?很多刚学 AI 的人。都会被几个词搞晕:SkillsFunction CallingMCP看起来都…...

C++内存对齐与布局优化

C内存对齐与布局优化内存对齐是编译器为了提高内存访问效率而采用的策略。理解内存对齐规则对于优化结构体大小和提高程序性能至关重要。结构体的内存布局受对齐规则影响,可能包含填充字节。#include #includestruct Unaligned { char a; int b; char c; };struct A…...

C++内联函数性能分析

C内联函数性能分析内联函数通过在调用点展开函数体来消除函数调用开销。理解内联机制和使用场景对于编写高性能代码至关重要。inline关键字建议编译器内联函数。#include #includeinline int add(int a, int b) { return a b; }inline int multiply(int a, int b) { return a …...

设计模式之建造者

问题:构造函数参数太多(「伸缩构造」),或步骤必须按顺序、且步骤组合多变。做法:Director(可选)规定步骤顺序;Builder 提供 setA()、setB()… 最后 build() 返回产品。C 要点&#x…...

向日葵远程控制16.5发布,“免密远控”功能登场便捷又安全

人在公司,急需处理家里电脑上的重要文件,却完全想不起访问密码或者系统的帐号密码;出差在外,想远程操作办公室电脑,却不得不打电话让同事帮忙看一眼密码设置甚至干脆让同事点个接受......密码虽然是一种非常主流的安全…...

WTEW的操作记录

WTEW的操作记录WTEW事务代码的操作记录WTEW事务代码的操作记录 1、查询贸易合同信息 如果是自己创建可以使用WB21、WB22、WB23事务码,如果是税码更新用WBRP更新价格 2、创建后续单据,采购TC创建采购订单,销售TC创建销售订单,注…...

Google三星AI眼镜来了,开发者该关注什么

AI 眼镜又回来了,但这次不只是换个硬件外壳AI 眼镜这个话题,最近又被推到了台前。Google 在 I/O 2026 展示了基于 Android XR 的智能眼镜方向,并把三星、Gentle Monster、Warby Parker 等合作方一起摆上台面。按照目前公布的信息,…...

数据结构——带懒标记的线段树

一、什么是线段树?线段树是一种二叉树数据结构,用于高效地处理区间查询和区间更新操作。核心思想:将数组分成若干个区间(线段),每个节点代表一个区间,通过合并子节点的信息来得到父节点的信息。…...

2026年企业AI落地新趋势!RAG知识库实战指南:环境搭建到生产部署全解析

本文介绍了RAG(检索增强生成)技术在企业知识库中的应用,通过从环境搭建到生产部署的完整实战指南,阐述如何利用RAG提升大语言模型回答的准确性、可追溯性和时效性。文章涵盖了基础环境配置、技术选型、数据准备、知识库构建、RAG系…...

终极Mac微信插件:消息防撤回与多开登录完整指南

终极Mac微信插件:消息防撤回与多开登录完整指南 【免费下载链接】WeChatExtension-ForMac A plugin for Mac WeChat 项目地址: https://gitcode.com/gh_mirrors/we/WeChatExtension-ForMac 还在为Mac微信无法防撤回消息而烦恼吗?想要在同一台电脑…...

一文讲清WMS软件是什么?企业为什么要用WMS软件?

在数字化供应链时代,WMS软件(仓储管理系统)已成为企业物流管理的核心。面对仓库混乱、库存不准,很多企业都在问:WMS软件到底是什么?它和Excel或进销存有什么区别?企业为什么要用WMS软件&#xf…...

Java基础小知识

一、 计算机基础知识1.计算机硬件的分类:运算器 控制器 存储器 输入设备 输出设备二、cmd命令窗口的基本用法操着: 说明:盘符名称 : 盘符切换。E:回车,表示切换到E盘dir 查看当前路径下的内容cd 目录 进入单级目录。cd…...

十三张扑克APP

能开发十三张扑克APP的请联系我,有客户渠道需要这类APP,要开发很多款十三张...

P2-CIFAR彩色图片识别

● 🍨 本文为🔗365天深度学习训练营中的学习记录博客 ● 🍖 原作者:K同学啊学习目标:1.编写一个完整的深度学习程序 2. 手动推导卷积层与池化层的计算过程一、前期准备1.设置GPUimport torch import torch.nn as nn im…...

CANN 算子融合技术:Conv-BN-ReLU 与 MatMul-LayerNorm 等融合模式深度解析

CANN 算子融合技术:Conv-BN-ReLU 与 MatMul-LayerNorm 等融合模式深度解析算子融合是提升性能的关键手段。本文深入讲解昇腾支持的算子融合技术、实现原理和应用实践。一、融合技术概述 1.1 为什么要融合 原始: Conv → BN → ReLU → Conv → BN → ReLU融合前内存…...

Gitea库完整从Ubuntu迁移到CentOS中

文章目录 一、概述 二、数据迁移 2.1 获取数据存储路径 2.2 搞事之前先备份(目标服务器CentOS) 2.2.1 停止gitea服务 2.2.2 备份gitea文件夹 2.3 从Ubuntu的数据目录中将数据拷贝到CentOS中 2.4 备份mysql数据库并拷贝到目标服务器(CentOS) 2.4.1 通过mysqldump备份数据库 …...

复杂干扰下考虑异质性的非机动车微观行为建模与仿真【附仿真】

✨ 长期致力于非机动车微观交通行为、异质性、感知—决策—行动三阶段、社会力模型、模糊逻辑研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)非机动车…...

(二) 1. Q-learning的遗憾界分析-高效的Q-learning算法

高效的Q-learning算法 1.1. 无模型算法 1.2. UCB算法 1.3. 文献回顾 无模型(Model-free)强化学习算法(如 Q-learning)无需显式地对环境进行建模,而是直接对价值函数或策略进行参数化和更新。与基于模型(Model-based)的方法相比,这类算法通常更简单、更灵活,因此在现代…...

企业微信外部群如何通过 API 自动化投递结构化小程序卡片

能力介绍 相比于传统的文字链接,结构化的小程序卡片拥有更高的点击率和更规范的视觉展现。该能力允许开发者通过主动调用 API,直接向指定的企业微信外部群投递原生小程序卡片。接口支持自定义动态配置小程序的 appid、首屏页面路径 pagepath&#xff08…...

obsidian博客联动方案

平台文章具有滞后性,最新文章请访问https://blog.nuoyis.net 原先博客需要使用typorapicgotypecho,其中typora编写完毕后需要复制到typecho后台去,极其不方便,然后经过高人指点,我对该软件交互使用开发了新高度 obsidi…...

【考研】2026/5/21

政治2026/5/21唯物辩证法本质上是批判的和革命的:在唯物辩证法看来,一切事物都处在发生、发展和灭亡的过程中,“不存在任何最终的东西、绝对的东西、神圣的东西”。唯物辩证法是客观辩证法与主观辩证法的统一:①客观辩证法&#x…...

1987年4月26日下午15-17点出生性格、运势和命运

1987年4月24日晚上出生的人,如今已步入38岁的门槛。在职业生涯中,这是一个承上启下的关键阶段——既脱离了职场新人的青涩,又尚未到达管理者或专家的巅峰位置。从非命理的角度分析,他们的事业运势与时代变迁、个人选择和社会结构密…...

企业AI合规:数据安全生死线

企业大模型应用中的数据安全合规体系建设 前言:数据安全合规——企业AI落地的必答题 一、合规风险识别与关键挑战 二、技术架构设计与安全合规方案 针对上述四大风险挑战,企业需要从技术架构层面构建纵深防御体系。以下从数据脱敏、访问控制、日志审计、…...

RAG三大冲突与三大死穴及解决方案

RAG :向量召回 稀疏匹配 重排序融合 动态裁剪 —— 冲突根源与工程解法 面向开发者的深度技术解析:揭开 RAG 检索 pipeline 中三个环节的底层冲突,以及幻觉漂移、上下文溢出、检索冗余三大企业级死穴的根治方案。 GitHub 项目地址&#xf…...

《数据挖掘(主编:吕欣 王梦宁)》读书笔记:异常检测方法梳理与实践理解

《数据挖掘(主编:吕欣 王梦宁)》读书笔记:异常检测方法梳理与实践理解本文是学习《数据挖掘(主编:吕欣 王梦宁)》中“异常检测”相关内容后的整理笔记。文章不追求逐条复述教材,而是…...

CANN-ATB多卡推理-昇腾NPU上Llama70B怎么切到8张卡

CANN-ATB多卡推理-昇腾NPU上Llama70B怎么切到8张卡 Llama2-70B 的权重 140GB,单张 Atlas 800I A2 的 64GB 显存放不下。ATB 的多卡推理用 Tensor Parallel 把模型切到多张 NPU 上,每张卡只存 1/N 的权重和 KV Cache。 Tensor Parallel 的切法 Llama2-70B…...

CANN 端侧部署实战:模型转换与服务化

CANN 端侧部署实战:模型转换与服务化如何将训练好的模型快速部署到昇腾端侧设备?本文详解模型格式转换、端侧优化与服务化部署的完整流程。—一、端侧部署概述 1.1 端侧部署的挑战 与数据中心训练不同,端侧部署面临独特的约束:算力…...