python3内存缓存_Python的内存管理和垃圾回收机制3:缓存机制

在Python的源码内部,在上述的的流程中提出了优化的机制,以提供效率:即  缓存机制。

缓存机制主要分成了两大类:池子。

为了避免重复创建和销毁常见的对象,所以维护了一个池子。例如v1=7,v2=9,v3=9。按理说会创建3个对象,加到refchain中。Python在启动的时候会默认创建-5,-4。。。。256,257创建好。所以在v1=7时,内部不会重新开辟内存,v2,v3均不会重新开辟内存,而是直接去维护的缓存池获取。

v1 =2

v2 =2

print(id(v1))

print(id(v1))

此时ID得出的结果是一样的,以此提升Python的运行效率。但是大于或者小于这些值时,会重新创建对象。

初始化小数值的时候,默认给了赋值次数1,初始化唯一次数1,不会给计数器为0的情况。

以缓存维护池有这些代表:int类型,字符串。

另外一类是free_list的机制:另外的这类是当对象的引用计数器为0时,按理应该进行回收,但是内部不会直接回收,而是添加到free_list链表中,当缓存使用。以后再去创建对象时,不在出现开辟内存,而是直接使用这个free_list。例如:

v1 = 3.14。会创建float类型,并且加入refchain中。del v1 则减1,refchain移除,按理会进行销毁,但是实际中不会真正销毁,而是会添加到free_list。以后创建v2=9.998等,只要是float类型,则不会重新开辟内存,会去free_list获取对象,对象内部进行初始化,替换值3.14换成9.99,再放到refchain中。不是所有的都放入free_list。例如存储80个缓存,则前面新创建的80个会放入free_list。如果满了81之后则会销毁。

以上的free_list的代表:float,list,tuple,dict。

所以:引用计数器为0时,未必会消耗,可能会存储到free_list中。

float是free_list。存储100个缓存。如果满了会销毁。

int是小数值池子。-5

list类似float。

字典类似float。

元组是free_list。不同的是按照维护的创建的元组内部个数,是根据索引,索引值最多,即item=19只能20个。

它的free_list是这样处理的。free_list=[0,1,2,3,4,5..19]  分别对应空元组,1个元素的元组(2000个),2个元素的元组(2000个)。。。以此类推。所以s1=(1,3), s2=("a", "b")。所以id此时应该一样。

str分成两种,字符型:一种类似小数值,unicode_latin1[256]存储ascii字符的存储起来,以后创建不会反复创建,也是启动的解析器的时候。字符串:采用驻留机制,但只针对字母,数字,下划线字符等。如果内存已存在,则不会重新创建,而是使用原来的地址,但是也不会像free_list一直存活在内存中,只在内存中有才能被重复利用,中文的话,不会驻留。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值