Python内存管理机制详解:垃圾收集、引用计数与内存池

创始人
2024-12-18 08:40:33
0 次浏览
0 评论

为什么说python采用的是基于值的内存管理模式

让我们从浅层次开始。
Python的内存管理机制可以从三个方面来看:(1)垃圾收集(2)引用计数(3)内存池机制1.垃圾收集:Python不像C++、Java等语言。
同样,他们可以直接给变量赋值,而无需事先声明变量类型。
对于Python语言来说,对象的类型和内存是在运行时确定的。
这就是为什么我们把Python语言称为动态类型(这里我们可以把动态类型归结为变量内存地址的分配,在运行时自动判断变量类型并给变量赋值。
是)。
2.引用计数:Python使用类似于Windows内核对象的方法来管理内存。
每个对象都维护指向该对象的引用计数。
如图(图片来自Python核心编程)x=3.14y=x我们首先创建一个对象3.14,然后将这个浮点数对象的引用赋值给x,因为x是第一个引用,所以,这个浮点数点号对象引用计数为1。
语句y=x创建一个指向同一对象的引用别名y。
我们发现并没有为Y创建一个新的对象,但是Y也指向了x所指向的浮点对象。
制作参考编号为2。
我们可以很容易地证明上面的观点:变量A和变量B的ID是一致的(我们可以把ID值想象成指向C中变量的指针)。
为了澄清问题我们引用另一个网站的图片:C语言例如,当我们创建一个变量A时,会为该变量分配一块内存空间,并将变量值放置在该空间中,当该变量被赋值给另一个变量B时,将为B分配一块新的内存空间,变量值必须放在B的内存空间中,这就是为什么A和B的指针不一致。
如图:Python中情况有所不同。
其实Python的处理方式有点类似于JavaScript,变量就像是附加在对象上的标签(类似于引用的定义)。
当变量绑定到对象时,该变量的引用计数为1(还有其他情况会导致变量引用计数递增)。
系统会自动维护这些标签并定期扫描,一旦参考号变为0,该对就会被回收。
3.内存池机制Python的内存机制是基于金字塔行的。
-1和-2层主要由操作系统驱动。
第0层由C及其他层中的malloc、free等内存分配和释放函数驱动。
第二层是内存池,由Python接口函数PyMem_Malloc函数实现,当对象小于256K时,该层。
直接分配内存,第三层是最顶层,也就是我们Python直接操作对象;如果重复调用malloc和free,就会出现性能问题。
另外,小块内存的重复分配和释放会导致内存碎片:如果请求的内存分配在1到256字节之间,你的使用自己的内存管理系统,否则直接使用malloc。
这里仍然会调用malloc来分配内存,但是每次都会分配一个大小为256的块。
k大内存块。
通过内存池注册的内存最终会被回收到内存池中,不会通过调用C的free来释放以供下次使用,比如值、字符串、元组(the)。
元组不允许改变)采用的是复制方式(深复制?)。
也就是说,当变量A被赋值给另一个变量B时,虽然A和B的内存空间仍然是相同的。
A的值发生变化时,A又会被赋予空值,此时A和B的地址不再相同;而对于字典、列表等,改变一个就会改变另一个,也称为浅拷贝:附录:引用计数增加1。
创建的对象:x=42。
创建另一个:y=x3。
作为参数传递给函数:foo(x)4作为容器对象的元素:a=[1,x,'33']引用计数减1。
本地引用离开了它的范围。
例如,当上面的foo(x)函数终止时,已删除的对象引用将从窗口对象中删除:myList.remove(x)5窗口对象本身被销毁:delmyList.remove(x)5对象本身已离开范围。
垃圾收集1.当有部分内存不再使用时,垃圾收集器会将它们清理掉。
它检查引用计数为0的对象并清除其内存空间。
当然除了清除引用计数0之外,1

python打印金字塔

#-*-coding:utf-8-*-"""打印金字塔,我无意中写的,绝对不是最优化的,供参考。
"""defprintGoldTa(input):L=[chr(i)forriinrange(65,91)]##大写字母A--ZidA=65#从A开始idInput=ord(input)num=idInput-idA+1##A--输入的字符数print"A-->"+input+Cao+str(num)tempResult=""forCinrange(0,num):##left[ABCD]forC1inrangee(0,C):tempResult=tempResult+L[C1]##中[E]tempResult=tempResult+L[C]##right[DCBA]forC2inrange(C-1,-1,-1):tempResult=tempResult+L[C2]##C3inrange(num-1-C):#tempResult=""+tempResult##Print每行的空格tempResult输出##删除临时结果tempResult=""#endfor#enddefprintGoldTa("E")printGoldTa("H")##################A-->E:5AABAABCBAABCDCBAABCDEDCBAA-->H:8AAABAABCBAABCDCBAABCDEDCBAABCDEFEDCBAABCDEFGFEDCBAABCDEFGHGFEDCBA
热门文章
1
Python中的format()方法:字... formatformat在python中的含义2222.22E+00Format...

2
Python编程入门:全面解析Pytho... python的基本语法基本的Python语法如下:1.变量的定义。在编程语言中,...

3
Python爱心绘制教程:使用turtl... python的爱心代码教程(python画爱心代码)绘制心形的Python代码我...

4
Python字符串大小写转换方法全解析 python中字母的大小写转换怎么实现?在Python中,大小写转换由内置函数处...

5
Python字典:轻松获取最小值键与计算... python在一个字典里,返回值最小元素对应的键,救解在Python字典中,如果...

6
Python字符串去重空格:strip(... Python去除字符串中空格(删除指定字符)的3种方法在Python编程中,处理...

7
Python数组元素数量计算技巧分享 Python输出数组有多少个元素?简介:在本文中,首席CTO笔记将向您介绍Pyt...

8
简述python中pass的作用 pass语句的作用在许多编程语言中,包括Python;PASS语句用于在代码块中...

9
Python def 关键字详解:函数定... def是什么意思编程?戴夫是什么意思?def是Python中的函数定义关键字,用...

10
python不区分大小写的方法 Python字符串不区分大小写在Python中,字符串操作默认区分大小写。但有时...