Python全系列 教程
3567个小节阅读:5931.7k
目录
鸿蒙应用开发
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
隔代回收
xxxxxxxxxx
分代回收是用来解决交叉引用(循环引用)
,并增加数据回收的效率. 原理:通过对象存在
的时间不同,采用不同的算法来 回收垃圾. 形象的比喻,
三个链表,零代链表上的对象(新创建的对
象都加入到零代链表),引用数都是一,每
增加一个指针,引用加一,随后python会检
测列表中的互相引用的对象,根据规则减
掉其引用计数.
GC算法对链表一的引用减一,引用为0的,
清除,不为0的到链表二,链表二也执行GC
算法,链表三一样.
存在时间越长的数据,越是有用的数据
xxxxxxxxxx
随着你的程序运行,Python解释器保持对新创建的对象,
以及因为引用计数为零而被释放掉的对象的追踪。从理论上说,
这两个值应该保持一致,因为程序新建的每个对象都应该最终被释放掉。
当然,事实并非如此。因为循环引用的原因,从而被分配对象的计数值
与被释放对象的计数值之间的差异在逐渐增长。一旦这个差异累计超过某个阈值,
则Python的收集机制就启动了,并且触发上边所说到的零代算法,
释放“浮动的垃圾”,并且将剩下的对象移动到一代列表。
随着时间的推移,程序所使用的对象逐渐从零代列表移动到一代列表。
而Python对于一代列表中对象的处理遵循同样的方法,一旦被分配计数值
与被释放计数值累计到达一定阈值,Python会将剩下的活跃对象移动到二代列表。
通过这种方法,你的代码所长期使用的对象,那些你的代码持续访问的活跃对象,
会从零代链表转移到一代再转移到二代。通过不同的阈值设置,Python可以在
不同的时间间隔处理这些对象。Python处理零代最为频繁,其次是一代然后才是二代。
查看引用计数
gc模块的使用
xxxxxxxxxx
常用函数:
1、gc.get_count()
获取当前自动执行垃圾回收的计数器,返回一个长度为3的列表
2、gc.get_threshold()
获取gc模块中自动执行垃圾回收的频率
3、gc.set_threshold(threshold0[,threshold1,threshold2])
设置自动执行垃圾回收的频率
4、gc.disable()
python3默认开启gc机制,可以使用该方法手动关闭gc机制
5、gc.collect()
手动调用垃圾回收机制回收垃圾
增加引用计数的条件
a.创建对象
xxxxxxxxxx
stu = Student()
b.将对象加入列表
xxxxxxxxxx
list1.append(stu)
c.对象被引用
xxxxxxxxxx
stu2 = stu
d.将对象作为参数,传入某个函数
xxxxxxxxxx
func(stu)
减少对象引用计数的情况
a.对象被显示销毁
xxxxxxxxxx
del stu
b.对象名指向新的对象
xxxxxxxxxx
stu = Student()
c.从容器中移除,或者显示销毁列表
xxxxxxxxxx
list1.remove(stu)
list1.pop(stu)
d.局部变量对象,作为函数参数,
xxxxxxxxxx
函数结束时,引用计数-1
获取某个对象的引用计数
xxxxxxxxxx
import sys
obj = 'Helloworld'
sys.getrefcount(obj)
list1 = []
list.append(obj)
sys.getrefcount(obj)