python基础---垃圾回收

垃圾回收

Python的机制

小整数对象池

Python为了优化速度使用了小整数对象池, 避免整数频繁申请和销毁

Python的[-5, 256]这些整数的对象提前建立好了, 不会被垃圾回收, 在Python里面所有的这一些数据实际使用的是同一个对象, 单个的字母也是这样的

如果是一个字符串, 这一个字符串的引用为0的时候这一个字符串会被回收

大整数对象池

每一个大整数实际都是一个新的对象

字符串驻留

相同的字符串默认开启intern机制, 指向同一个对象, 字符串里面有空格等特殊字符的时候不会开启这一个机制

垃圾回收

Garbage collection垃圾回收, 高级语言里面一般都有自己的回收机制, C语言里面的内存为自己管理的

Python里面有一个自己的回收机制, Python使用自动引用计数(Reference Counting)和循环垃圾回收(Cycle Detection)来实现垃圾回收。

  1. 引用计数:Python使用引用计数来跟踪内存中的对象引用数量。当对象被创建时,引用计数会增加;当对象被引用时,引用计数会减少。当引用计数为0时,对象被释放并回收内存。
  2. 循环垃圾回收(隔代收集):虽然引用计数可以处理大部分情况下的内存释放,但是循环引用会导致引用计数失效。当对象之间存在循环引用时,Python会使用循环垃圾回收机制来检测和清理这些无法访问到的对象。

Python里面会有一部分没有办法释放的内存, 所以需要使用GC

引用计数的优缺点

  • 优点
  1. 简单
  2. 实时性没有使用的时候直接释放, 回收的时间平摊在平时
  • 缺点
  1. 维护计数消耗资源
  2. 无法解决循环引用(多个对象相互记录)

零代

Python使用了一个链表记录已经创建了的对象, 这一个链表叫做零代链表

Python会循环遍历这一个链表, 找出里面的相互调用的对象进行统计, 在实际回收的时候, 会把这些循环引用的数值进行减少, 之后把还在使用的对象移动到另一条链子上面

Python里面有一个阈值, 根据创建的对象的个数以及删除的对象的个数进行调用这一个回收机制

测试

import gcclass ClassA():def __init__(self) -> None:print("object born, id %s"%str(id(self)))def f2():while True:c1 = ClassA()c2 = ClassB()c1.t = c2c2.t = c1del c1del c2
# 关闭内存管理
gc.disable()
f2()

触发条件

  1. gc模块达到一个阈值的时候自动回收
  2. 使用gc.collect手动回收
  3. 程序退出, 解释器会回收

引用计数变换的条件

  • +1
  1. 对象创建的时候
  2. 对象引用的时候
  3. 作为参数传入一个函数
  4. 作为一个元素记录在容器里面
  • -1
  1. 使用del的时候
  2. 对象的别名给了他一个新的值
  3. 一个对象离开他的作用域
  4. 对象所在的容器销毁, 或者从容器里面删除的时候

可以使用sys模块里面的sys.getrefcount()函数查看这一个对象的引用个数

垃圾回收触发机制

python里面使用隔代收集的方法, 对象在创建的时候在一代列表里面, 一代的检查以后进入二代列表, 以此类推, 最多三代列表

可以使用gc.get_count获取这一个列表的计数器

In [6]: import gcIn [7]: gc.get_count()
Out[7]: (62, 0, 8)

这里的62是距离上一次一代检查, python分配减去释放的内存个数, 0是距离上一次二代检查一代检查的次数, 8是二代检查的次数

In [8]: gc.get_threshold()
Out[8]: (700, 10, 10)

这一个是阈值

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

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

相关文章

【算法系列】链表

目录 常用技巧 常用操作 leetcode/牛客题目 一、移除链表元素 二、反转链表 三、链表的中间结点 四、返回倒数第k个节点 五、合并两个有序链表 六、链表分割 七、链表的回文结构 八、相交链表 九、环形链表 十、环形链表 II 十一、随机链表的复制 十二、两数相加…

【图像增强(空域)】基于灰度变换的图像增强及Matlab仿真

1. 摘要: 空域内的图像增强就是调整灰度图像的明暗对比度,对图像中各个像素的灰度值直接进行处理。常用的方法包括:灰度变换增强和直方图增强。 2. 原理: 灰度变换增强是空域ne对图像进行增强的一种简单且直接的方法。灰度变换…

K8S Redis-Cluster安装(含redis-cluster-proxy、RedisInsight)

参考:在 K8S 中快速部署 Redis Cluster & Redisinsight 参考:Redis 中文文档(一) helm redis-cluster [rootk8s-master01 redis-cluster]# helm search repo redis-cluster NAME CHART VERSION APP …

使用CUDA的PyTorch进行张量重整化的gpu加速

使用CUDA的PyTorch进行张量重整化的gpu加速 摘要IntroductionAlgorithm and TorchTrg discussionModels and Results GPU-Acceleration of Tensor Renormalization with PyTorch using CUDA 摘要 作者展示了基于张量重整化群(TRG)方法的数值计算可以通过…

绝地求生:季后赛名额确定!NH战队总积分榜排名第一!

2024年5月5日,PCL春季赛常规赛第五阶段第三天比赛结束,今天打完春季赛常规赛结束,16个战队进入季后赛的名额已确定。NH战队总积分506分,总积分榜排名第一!!NH战队也是唯一一支总积分超过500分的队伍。今天最…

【前端】HTML实现个人简历信息填写页面

文章目录 前言一、综合案例:个人简历信息填写页面 前言 这篇博客仅仅是对HTML的基本结构进行了一些说明,关于HTML的更多讲解以及CSS、Javascript部分的讲解可以关注一下下面的专栏,会持续更新的。 链接: Web前端学习专栏 下面我对…

LLaMA 羊驼系大语言模型的前世今生

关于 LLaMA LLaMA是由Meta AI发布的大语言系列模型,完整的名字是Large Language Model Meta AI,直译:大语言模型元AI。Llama这个单词本身是指美洲大羊驼,所以社区也将这个系列的模型昵称为羊驼系模型。 Llama、Llama2 和 Llama3…

C++字模软件发送 单片机接收显示

/****先定义数组类型再赋值**L310*********/ /*2014 8 21 10:01**PAST*CODE1000**TEST**/ #include<reg51.h> #define uint unsigned int #define uchar unsigned char sfr AUXR0x8e; //辅助寄存器 sfr SADDR0xA9; …

读字库写FM24C04

/*PCB机板增加读写24C64函数PAST 2017 12 26 08:10 CODE 7382*/ /*按11键进入手动选择&#xff0c;按12键进入参数设定界面 按1存1 2存2 3存3 15存0 16存1236 17读EEPROM显示正确 L1008 13775061792 ******/ #include <reg52.h>…

多链路聚合设备是什么

多链路聚合设备属于通信指挥装备。 乾元通多链路聚合设备&#xff0c;它能够将多个网络链路聚合成一个逻辑链路&#xff0c;以实现高速、稳定、可靠的数据传输。多链路聚合设备的核心技术包括链路聚合、负载均衡、故障切换等&#xff0c;能够智能管理和优化利用不同网络链路&a…

websevere服务器从零搭建到上线(二)|Linux上的五种IO模型

文章目录 阻塞 blocking非阻塞 non-blockingIO复用 IO multiplexing信号驱动 signal-driven异步 asynchronous拓展知识 看过上篇文章英国基本能理解本文五张图的内容websevere服务器从零搭建到上线&#xff08;一&#xff09;&#xff5c;阻塞、非阻塞、同步、异步 本文要能够在…

【postgresql初级使用】可以存储数据的视图-物化视图,加速大数据下的查询分析

物化视图 ​专栏内容&#xff1a; postgresql使用入门基础手写数据库toadb并发编程 个人主页&#xff1a;我的主页 管理社区&#xff1a;开源数据库 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 文章目录 物化视图概述 …

HIVE统计WordCount

HIVE WORDCOUNT 目录 HIVE WORDCOUNT 一、WORDCOUNT 1.我们先创建一个新的数据库 2.创建表并插入数据 3.统计WORDCOUNT 4.UNION ALL 用法 5.WITH AS 用法 1.WORDCOUNT 1&#xff09;我们先创建一个新的数据库 create database learn3;use learn3; 2&#xff09;创建表…

知识图谱融入RAG模型:LinkedIn重塑智能客服新范式【附LeCun哈佛演讲PPT】

原文&#xff1a;Retrieval-Augmented Generation with Knowledge Graphs for Customer Service Question Answering 一、研究背景与问题 在客服领域,快速准确地匹配用户问题与历史工单,是提供优质回答的关键。传统的检索增强生成(Retrieval-Augmented Generation, RAG)方法虽…

分享5款PDF编辑软件

PDF编辑不易&#xff0c;有需要的朋友可以试试这5款专业软件&#xff0c;每一个都能直接在PDF文件上编辑&#xff0c;不同的软件对PDF可编辑的范围不同&#xff0c;大家可以按需求选用。 1.edge浏览器 Edge浏览器不仅是浏览网页的得力助手&#xff0c;还悄然成为了轻量级PDF管…

微信小程序开发秘籍:解锁音频录制与录音功能的奥秘

微信小程序开发秘籍&#xff1a;解锁音频录制与录音功能的奥秘 在微信小程序的开发旅程中&#xff0c;音频功能的集成可以极大地丰富用户体验&#xff0c;特别是在教育、娱乐、社交等领域。本文将引领你深入了解如何在微信小程序中实现音频录制和播放功能&#xff0c;从基本概…

2024蓝桥杯RSA-Theorem

方法1&#xff1a;直接使用工具yafu解题 yafu的使用方法 安装&#xff1a;解压后直接使用即可&#xff0c;在文件包内&#xff0c;执行命令终端&#xff0c;输入命令行 1、如果数比较小&#xff0c;进入该文件的目录后可以直接使用: yafu-x64 factor(n) 如果是powershell&…

Element-UI快速入门:构建优雅的Vue.js应用界面

Element-UI是一套基于Vue.js的组件库&#xff0c;提供了丰富的UI组件和交互效果&#xff0c;帮助开发者快速构建出美观、功能丰富的Web应用界面。本文将介绍如何快速入门Element-UI&#xff0c;并搭建一个简单的示例界面。 步骤一&#xff1a;安装Element-UI 首先&#xff0c…

Embeddings原理、使用方法、优缺点、案例以及注意事项

Embeddings是一种将高维数据映射到低维空间的技术&#xff0c;常用于处理自然语言处理&#xff08;NLP&#xff09;和计算机视觉&#xff08;CV&#xff09;任务。Embeddings可以将复杂的高维数据转换为低维稠密向量&#xff0c;使得数据可以更容易地进行处理和分析。本文将介绍…

张家界(24-17)

目录 总路线酒店&#xff1a;深圳北->张家界西&#xff08;day1 07:14~13:45&#xff09;张家界西&#xff08;酒店&#xff09;->张家界森林公园东门&#xff08;day2 早上&#xff09;张家界森林公园东门->张家界西&#xff08;day2 19:48分的高铁&#xff09;张家界…