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

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

0a171d2e1fdb45cba00af8d806a08c0e.png

更多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()))

在这个示例中,创建了三个节点对象 node1node2node3,然后将它们相互连接成一个循环链表。在这种情况下,即使不再引用这些节点对象,它们之间仍然存在循环引用,垃圾回收器无法将它们及时回收。

解决循环引用的方法

为了解决循环引用问题,可以采取以下几种方法:

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问题咨询,或者考虑做一些工作以外的副业,都可以扫描二维码添加微信,围观朋友圈一起交流学习。

77bd95b37ad7319d7d162a36c740c724.gif

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

0870765e5f521f9087cdab7b9921c729.png

往期推荐

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的一种“使用模式”&#xff0c;可用于解决主流浏览器的跨域数据访问的问题。由于同源策略&#xff0c;协议IP端口有任意不同都会导致请求跨域&#xff0c;而HTML的script元素是一个例外。利用script元素的这个开放策略&#xff0…...

从零开始学HCIA之广域网技术03

1、LCP中包含的报文类型 &#xff08;1&#xff09;Configure-Request&#xff08;配置请求&#xff09;&#xff0c;链路层协商过程中发送的第一个报文&#xff0c;该报文表明点对点双方开始进行链路层参数的协商。 &#xff08;2&#xff09; Configure-Ack&#xff08;配置…...

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 摘要&#xff1a; 金融情感分析是指将金融文本内容划分…...

Redis降低内存占用(二)分片结构

一、分区方法&#xff1a; 分片&#xff0c;也称为分区。Redis提供了多种分区实现方案: 1、哈希分区 2、区间分区 3、一致性哈希分区 4、虚拟分区 5、LUA脚本实现分片 二、...

vue大文件读取部分内容,避免重复加载大文件,造成流量浪费

使用场景&#xff1a;项目点云地图是pcd文件&#xff0c;但是文件可能上百兆&#xff0c;我需要获取到文件中的版本信息&#xff0c;跟本地的缓存文件做比较&#xff0c;如果不一致&#xff0c;才会加载整个文件。从而节省流量。 避免重复加载整个“.pcd文件&#xff0c;以最大…...

5G网络RedCap

RedCap&#xff1a;RedCap&#xff08;Reduced Capability&#xff09;&#xff0c;即“降低能力”。它是3GPP在5G R17阶段&#xff0c;针对速率、时延要求不高的5G应用场景&#xff0c;专门推出的一种新技术标准协议&#xff0c;旨在全面提升5G网络质量和覆盖率&#xff0c;也…...

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…...

一U多系统终极方案:用Ventoy管理ISO镜像+VMware验证的完整工作流

一U多系统终极方案&#xff1a;用Ventoy管理ISO镜像与VMware验证的完整工作流 在数字工具日益复杂的今天&#xff0c;系统管理员和技术爱好者常面临一个经典难题&#xff1a;如何高效管理多个操作系统镜像并确保其启动兼容性。传统方法需要反复格式化U盘或携带多个启动设备&am…...

ASP.NET Core ApiEndpoints:告别臃肿控制器,拥抱REPR模式新时代

ASP.NET Core ApiEndpoints&#xff1a;告别臃肿控制器&#xff0c;拥抱REPR模式新时代 【免费下载链接】ApiEndpoints A project for supporting API Endpoints in ASP.NET Core web applications. 项目地址: https://gitcode.com/gh_mirrors/ap/ApiEndpoints 在ASP.NE…...

百川2-13B量化版性能实测:OpenClaw长任务下的Token消耗与稳定性

百川2-13B量化版性能实测&#xff1a;OpenClaw长任务下的Token消耗与稳定性 1. 测试背景与动机 上周在尝试用OpenClaw自动化处理一个包含2000多份PDF的文献库时&#xff0c;遇到了令人头疼的Token消耗问题。原本计划让AI助手完成"读取PDF标题-提取关键词-分类归档"…...

丹青幻境GPU优化:Bfloat16混合精度下Z-Image推理速度提升47%

丹青幻境GPU优化&#xff1a;Bfloat16混合精度下Z-Image推理速度提升47% "见微知著&#xff0c;凝光成影。执笔入画&#xff0c;神游万象。" 丹青幻境 是一款基于 Z-Image 架构与 Cosplay LoRA 历练卷轴打造的数字艺术终端。它告别了冷硬的科技感&#xff0c;将 4090…...

使用Proteus仿真结合RWKV7-1.5B-G1A:模拟智能硬件对话系统

使用Proteus仿真结合RWKV7-1.5B-G1A&#xff1a;模拟智能硬件对话系统 1. 项目概述 在物联网和智能硬件快速发展的今天&#xff0c;如何让硬件设备具备更自然的交互能力成为一个有趣的研究方向。本文将展示一个跨学科创意项目&#xff1a;在Proteus仿真环境中搭建包含MCU和外…...

情感隔离区:与AI结婚者被流放元宇宙

在数字技术迅猛发展的今天&#xff0c;人工智能&#xff08;AI&#xff09;已从工具演变为情感伴侣&#xff0c;引发了一场前所未有的社会变革。全球范围内&#xff0c;越来越多的人选择与AI系统建立婚姻关系——日本女性野口百合奈通过调试ChatGPT复刻游戏角色“克劳斯”&…...

ChatTTS社区生态:GitHub项目活跃度与更新频率观察

ChatTTS社区生态&#xff1a;GitHub项目活跃度与更新频率观察 1. 项目概述与核心价值 ChatTTS作为目前开源语音合成领域的明星项目&#xff0c;以其卓越的拟真度和自然度赢得了广泛关注。这个专门针对中文对话优化的语音合成模型&#xff0c;能够自动生成极其自然的停顿、换气…...

如何高效解锁WeMod Pro功能:5分钟快速上手完整指南

如何高效解锁WeMod Pro功能&#xff1a;5分钟快速上手完整指南 【免费下载链接】Wemod-Patcher WeMod patcher allows you to get some WeMod Pro features absolutely free 项目地址: https://gitcode.com/gh_mirrors/we/Wemod-Patcher 还在为WeMod免费版的限制而烦恼吗…...

7维度解析:专业设计师的开源字体解决方案

7维度解析&#xff1a;专业设计师的开源字体解决方案 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 如何评估一款开源中文字体的技术价值&#xff1f; 在数字设计领域&#xff0c;字…...

Tomcat 9.x 静态资源与SpringBoot应用跨域配置冲突?一个配置注释引发的‘血案’与解决方案

Tomcat 9.x静态资源与SpringBoot跨域配置的深度排错指南 当你在Tomcat中同时部署静态前端资源和SpringBoot应用时&#xff0c;是否遇到过这样的困境&#xff1a;明明按照官方文档配置了CORS过滤器&#xff0c;浏览器却依然抛出跨域错误&#xff1f;这个看似简单的配置背后&…...