Python 内存管理和优化之循环引用

更多Python学习内容:ipengtao.com
Python 是一种高级动态编程语言,其内存管理由解释器自动完成。在大多数情况下,Python 的内存管理是透明的,开发者不需要过多地关注。然而,在处理大型数据结构或长时间运行的应用程序时,了解 Python 内存管理的工作原理以及优化技巧是非常重要的。本文将重点介绍 Python 中的循环引用问题,探讨其原因、影响以及解决方法。
循环引用的定义
循环引用指的是两个或多个对象之间相互引用,形成一个闭环的情况。在 Python 中,循环引用会导致对象之间的引用计数不为零,使得对象无法被垃圾回收器及时回收,从而造成内存泄漏的问题。
循环引用的原因
循环引用通常发生在对象之间相互引用的情况下,常见的情况包括:
-
对象之间存在双向引用,即对象 A 引用了对象 B,对象 B 同时也引用了对象 A。
-
对象之间存在环状引用,即对象 A 引用了对象 B,对象 B 引用了对象 C,对象 C 又引用了对象 A。
循环引用的影响
循环引用会导致对象无法被及时回收,从而占用大量的内存空间,引起内存泄漏。特别是在长时间运行的应用程序中,循环引用可能会导致内存使用不断增加,最终耗尽系统的内存资源,影响系统的稳定性和性能。
循环引用的示例
通过示例代码来演示循环引用的情况。
import gcclass Node:def __init__(self, value):self.value = valueself.next = None# 创建循环引用
node1 = Node(1)
node2 = Node(2)
node3 = Node(3)node1.next = node2
node2.next = node3
node3.next = node1# 手动触发垃圾回收
gc.collect()print("垃圾回收后,对象数目:", len(gc.get_objects())) 在这个示例中,创建了三个节点对象 node1、node2 和 node3,然后将它们相互连接成一个循环链表。在这种情况下,即使不再引用这些节点对象,它们之间仍然存在循环引用,垃圾回收器无法将它们及时回收。
解决循环引用的方法
为了解决循环引用问题,可以采取以下几种方法:
1 手动解除引用
在不再需要使用对象时,手动将对象的引用设置为 None,以便让垃圾回收器能够及时回收对象。
node1.next = None
node2.next = None
node3.next = None# 手动触发垃圾回收
gc.collect()print("垃圾回收后,对象数目:", len(gc.get_objects())) 2 使用 weakref
weakref 模块提供了一种特殊的引用类型,称为弱引用(weak reference),它不会增加对象的引用计数,不会阻止对象被垃圾回收。因此,使用弱引用可以避免循环引用导致的内存泄漏问题。
import weakrefclass Node:def __init__(self, value):self.value = valueself.next = Nonenode1 = Node(1)
node2 = Node(2)
node3 = Node(3)node1_ref = weakref.ref(node1)
node2_ref = weakref.ref(node2)
node3_ref = weakref.ref(node3)# 创建循环引用
node1.next = node2
node2.next = node3
node3.next = node1# 手动触发垃圾回收
gc.collect()print("垃圾回收后,对象数目:", len(gc.get_objects())) 通过使用弱引用,可以避免循环引用导致的内存泄漏问题,提高程序的内存利用率。
总结
本文介绍了 Python 中循环引用的概念、原因以及影响,并通过示例代码演示了循环引用的情况。针对循环引用问题,提供了两种解决方法:手动解除引用和使用 weakref 模块。在实际开发中,应该注意避免循环引用的产生,并选择合适的方法来解决循环引用问题,以保证程序的内存管理效率和性能。
如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!
如果想要系统学习Python、Python问题咨询,或者考虑做一些工作以外的副业,都可以扫描二维码添加微信,围观朋友圈一起交流学习。

偷偷告诉大家一句:加了好友之后,备注 优质资料 可以额外免费获取一份价值 99 的《Python学习优质资料》,帮助你更好的学习Python。

往期推荐
Python基础学习常见的100个问题.pdf(附答案)
100个爬虫常见问题,完全版PDF开放下载!
学习 数据结构与算法,这是我见过最友好的教程!(PDF免费下载)
Python办公自动化完全指南(免费PDF)
Python Web 开发常见的100个问题.PDF
历时一个月整理的 Python 爬虫学习手册全集PDF(免费开放下载)
相关文章:
Python 内存管理和优化之循环引用
更多Python学习内容:ipengtao.com Python 是一种高级动态编程语言,其内存管理由解释器自动完成。在大多数情况下,Python 的内存管理是透明的,开发者不需要过多地关注。然而,在处理大型数据结构或长时间运行的应用程序时…...
「Kafka」监控、集成篇
Kafka-Eagle 监控 Kafka-Eagle 框架可以监控 Kafka 集群的整体运行情况,在生产环境中经常使用。 MySQL环境准备 Kafka-Eagle 的安装依赖于 MySQL,MySQL 主要用来存储可视化展示的数据。 安装步骤参考:P61 尚硅谷 kafka监控_MySQL环境准备 …...
Linux之用户和用户组用户账号系统文件
一、简介 1.用户的定义 在linux系统中用户(User)需要用用户账号来访问系统,服务和信息,系统中的每个进程(运行的程序)都是使用一个特定的用户运行。每个文件都属于一个特定的用户所有。对文件和目录的访…...
ESP8266 (5),驱动屏幕
代码 第一步设置驱动库TFT_eSPI的默认配置文件 1,设置适配的屏幕 #define ST7789_DRIVER 2,设置屏幕大小 #define TFT_WIDTH 170 #define TFT_HEIGHT 320 3,设置屏幕驱动板端口和ESP8266对应的端口 // For NodeMCU - use pin numbers in the…...
ChatGPT-01 用ChatGPT指令,自学任何领域的系统知识
1. 指令位置 Github仓库:Mr Ranedeer AI Tutor 但是需要开通chatgtp plus版本,并且打开代码解释器 2 使用 学习内容 开始学习 GPT甚至可以给你思考题,给出的答案还能进行评价 配置 通过配置表修改 深度 学习风格 沟通风格 语气风格 …...
android studio模拟器不能打开
Andriod:The selected AVD is currently running in the Emulator. Please exit the emulator instance… 1.点击 2.删除下面文件 3.重新打开即可 参考...
设计模式学习笔记 - 面向对象 - 5.接口和抽象类的区别
简述 在面向对象编程中,抽象类和接口是常被用到的语法概念,是面向对象四大特性,以及很多设计模式、设计思想、设计原则实现的基础。它们之间的区别是什么?什么时候用接口?什么时候用抽象类?抽象类和接口存…...
PolarDN MISC做题笔记
cat flag 使用01打开flag.png,发现图片尾部有padding的数据。D0 CF 11 E0 A1 B1 1A E1为office2007以前版本的文件头。将其另存为flag.doc,打开发现提示需要密码。(可以注意到:D0CF11E0非常类似DOCFILE) 使用john的office2john.py 提取hash …...
Web安全之浅见
备注:这是我在2017年在自己的网站上写的文章,今天迁移过来。 昨天去参加了公司组织的一个关于网络安全的培训,了解了很多关于网络安全方面的知识,也才意识到网络安全是一项极其重要的领域。 本篇文章主要聊聊Web安全。不过我对于网…...
企业安全建设工具推荐
全自动化挖洞,助力企业安全建设,一键实现域名扫描、IP 发现、端口扫描、服务识别、网站识别、漏洞探测、分析发现、合规检查。 使用方式: 录入目标企业名称即可开始使用 技术细节: 第一步:通过企业主体关联企业备案…...
力扣(leetcode)第455题分发饼干(Python)
455.分发饼干 题目链接:455.分发饼干 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i…...
隐私也要付费?Meta公司为收集用户数据再出“奇招”
Cybernews网站消息,有相关人士表示,如果欧洲数据保护委员会(EDPB)不明确指出Meta公司的“付费或同意”的模式违反了欧盟的隐私法规,那么这一模式很可能会被大规模复制,危及数百万欧洲公民的自由选择权。 自…...
Android14 InputManager-InputReader的处理
IMS启动时会调用InputReader.start()方法 InputReader.cpp status_t InputReader::start() {if (mThread) {return ALREADY_EXISTS;}mThread std::make_unique<InputThread>("InputReader", [this]() { loopOnce(); }, [this]() { mEventHub->wake(); });…...
web前端安全性——JSONP劫持
1、JSONP概念 JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,协议IP端口有任意不同都会导致请求跨域,而HTML的script元素是一个例外。利用script元素的这个开放策略࿰…...
从零开始学HCIA之广域网技术03
1、LCP中包含的报文类型 (1)Configure-Request(配置请求),链路层协商过程中发送的第一个报文,该报文表明点对点双方开始进行链路层参数的协商。 (2) Configure-Ack(配置…...
AI推介-大语言模型LLMs论文速览(arXiv方向):2024.01.01-2024.01.10
1.Pre-trained Large Language Models for Financial Sentiment Analysis 标题:用于金融情感分析的预训练大型语言模型 author:Wei Luo, Dihong Gong date Time:2024-01-10 paper pdf:http://arxiv.org/pdf/2401.05215v1 摘要: 金融情感分析是指将金融文本内容划分…...
Redis降低内存占用(二)分片结构
一、分区方法: 分片,也称为分区。Redis提供了多种分区实现方案: 1、哈希分区 2、区间分区 3、一致性哈希分区 4、虚拟分区 5、LUA脚本实现分片 二、...
vue大文件读取部分内容,避免重复加载大文件,造成流量浪费
使用场景:项目点云地图是pcd文件,但是文件可能上百兆,我需要获取到文件中的版本信息,跟本地的缓存文件做比较,如果不一致,才会加载整个文件。从而节省流量。 避免重复加载整个“.pcd文件,以最大…...
5G网络RedCap
RedCap:RedCap(Reduced Capability),即“降低能力”。它是3GPP在5G R17阶段,针对速率、时延要求不高的5G应用场景,专门推出的一种新技术标准协议,旨在全面提升5G网络质量和覆盖率,也…...
vue+springboot登录与注册功能的实现
①首先写一个登录页面 <template> <div style"background-color: #42b983;display: flex;align-items: center;justify-content: center;height: 100vh"><div style"background-color: white;display: flex;width: 50%;height: 50%;overflow: h…...
SpringBoot+Vue物流管理系统源码+论文
代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 分享万套开题报告任务书答辩PPT模板 作者完整代码目录供你选择: 《SpringBoot网站项目》1800套 《SSM网站项目》1500套 《小程序项目》1600套 《APP项目》1500套 《Python网站项目》…...
华为eNSP新手避坑指南:用VRF模拟多租户网络,为什么你的Ping不通?
华为eNSP实战:VRF多租户网络排错全解析 第一次在华为eNSP中用VRF模拟多租户网络时,那种"明明配置都对,但就是Ping不通"的挫败感,相信很多网络工程师都深有体会。VRF作为网络虚拟化的核心技术,其路由隔离特性…...
10个ProjectLearn性能优化技巧:提升网站加载速度和用户体验的终极指南
10个ProjectLearn性能优化技巧:提升网站加载速度和用户体验的终极指南 【免费下载链接】projectlearn-project-based-learning A curated list of project tutorials for project-based learning. 项目地址: https://gitcode.com/gh_mirrors/pr/projectlearn-proj…...
Kotaemon在教育培训中的应用:如何构建可信赖的学科答疑助手?
Kotaemon在教育培训中的应用:如何构建可信赖的学科答疑助手? 1. 教育场景中的AI答疑痛点 想象这样一个场景:晚自习教室里,一个学生正为生物作业发愁。他在手机上输入:"光合作用的暗反应发生在叶绿体的哪个部位&…...
告别DAC!用Arduino的PWM信号和双光耦,轻松驱动LM317实现4-20mA隔离输出
用Arduino PWM与双光耦打造高性价比4-20mA隔离输出方案 在工业自动化与物联网设备开发中,4-20mA电流环传输因其抗干扰能力强、传输距离远等优势,成为模拟信号传输的黄金标准。传统方案通常依赖昂贵的DAC芯片实现数字到模拟的转换,而本文将揭…...
SDMatte在智能硬件配套:嵌入式设备端Web服务裁剪、ARM64交叉编译与内存精简
SDMatte在智能硬件配套:嵌入式设备端Web服务裁剪、ARM64交叉编译与内存精简 1. 技术背景与挑战 在智能硬件领域,嵌入式设备通常面临资源受限的挑战: 计算能力有限:ARM架构处理器性能远低于服务器级GPU内存资源紧张:…...
OpenClaw语音交互方案:Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF对接语音输入输出模块
OpenClaw语音交互方案:Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF对接语音输入输出模块 1. 为什么需要语音交互能力 去年冬天的一个深夜,我正蜷在沙发上调试一个自动化脚本,突然意识到——当双手被咖啡杯占据时,用语…...
AcousticSense AI作品分享:识别不同音乐流派的频谱图展示
AcousticSense AI作品分享:识别不同音乐流派的频谱图展示 1. 当AI学会"看"音乐:频谱图里的流派密码 你有没有想过,AI是如何像人类一样理解音乐的?传统方法往往依赖复杂的音频特征提取,而AcousticSense AI选…...
Ostrakon-VL-8B智能代理(Agent)实践:自动化巡检餐厅后厨
Ostrakon-VL-8B智能代理实践:自动化巡检餐厅后厨 你有没有想过,如果餐厅后厨能有一个不知疲倦、眼力超群的“数字监工”,每天自动检查安全隐患和操作规范,那会是什么场景?过去,这可能需要一个经验丰富的厨…...
用DeerFlow做竞品分析:5分钟自动生成全面竞品研究报告
用DeerFlow做竞品分析:5分钟自动生成全面竞品研究报告 1. DeerFlow简介:您的智能研究助手 DeerFlow是一款由字节跳动开源的深度研究自动化工具,它整合了语言模型、网络搜索和代码执行能力,能够快速完成复杂的研究任务。这个工具…...
