Python高级特性
前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、内存化
小整数对象池:[pycharm自动优化]- 解释器 [-5,257)共用对象,常驻内存 单个字符共用对象,常驻内存
- 单个单词,不可修改,默认开启intern机制,共用对象,引用计数为0,则销毁
- 字符串(含有空格),开启intern机制,不共用对象,引用计数为0,销毁
python采用的是引用计数机制为主、标记-清除和分代收集两种机制为辅的策略
引用计数
在这里插入代码片
二、垃圾回收
1.引用计数
-
List item导致引用计数+1的情况
· 对象被创建,例如a=23
· 对象被引用,例如b=a
· 对象被作为参数,传入到一个函数中,例如func(a) -
导致引用计数-1的情况
· 对象的别名被显式销毁,例如del a
· 对象的别名被赋予新的对象,例如a=24
· 一个对象离开它的作用域,例如f函数执行完毕时,func函数中的局部变量(全局变量不会)
· 对象所在的容器被销毁,或从容器中删除对象
代码如下:
import sys
x='axax'
y=sys.getrefcount(x)
print(y)
引用计数无法解决 循环引用问题
使用标记-清除
2.分代收集 (0代、1代、2代)
- 0代检查时间最频繁
代码如下(示例):
import gc
gc.disable() #关闭垃圾回收机制
print (gc.isenabled ( )) #是否开启
gc.set_debug(gc.DEBUG_LEAK) #打开调试
gc.collect() #手动回收
gc.collect(1) #一代
print (gc.garbage) #打印垃圾
print (gc.get_count ( )) #
关于一代二代三代检查
print (gc.get_count ( ))
class Person():
pass
x=[]
for i in range(10):
x.append(Person())
print (gc.get_count ( ))
> (641, 4, 1)
> (655, 4, 1)
gc.get_threshold() #获得阈值
gc.set_threshold(10,1,1)#设置阀值