1. 什么是缓存机制
Python对象在创建的时候,会为其开辟一个内存,当变量引用该对象时,实际上是指向该对象的内存地址,当该对象不在被引用,会被垃圾回收机制回收,释放内存。但是Python为了解决对象创建—开辟内存,对象回收—释放内存这么一个对内存反复操作导致时间的浪费,就有了缓存池这一概念来管理一些常见的对象,当对象的引用计数为0时,他从refchain链表中删除,并不是直接销毁,而是放到了一个free_list的链表中进行缓存,当出现一个类型相同的对象时,直接用他的上一个对象的内存地址,只需在refchain中对其值进行初始化即可。
2. 缓存池机制
Python在启动时,会创建一部分对象并将他们放置缓存池中,当引用这些对象时,不会重新创建,而是直接引用缓存,如整型[ -5 —256 ],布尔类型,字符串类型
1. 整型
2. 布尔类型
3. 字符串
3. 驻留机制
1. python的驻留机制是python系统内部维护了一个叫 “interned” 的字典,当允许被驻留的数据首次创建时,会被记录到该字典中,如果在 “同一个代码块中(代码块可以是一个模块,一个函数,一个类,一个文件)” 该数据被删除或者被其他对象再次引用时,不开辟新的内存空间,而是直接指向驻留空间中的内存地址,这样可以大量的节省内存空间。不同版本的驻留机制可能不太相同,以3.7版本为例:整型、浮点型、布尔型,字符型都满足驻留机制。
举个例子:
当a = 11111,b 也引用11111这个对象,则b的地址直接执行11111的内存地址,不在重新创建新的内存地址
元组,列表,集合,字典他们不符合驻留机制,即使他们的元素内容相同,所执行的内存地址也是不相同的,但是空元组的内存地址却是相同的。
元组:
列表:
4. free_list机制
free_list机制是对特定的数据类型的缓存而进行的存储链表,如[-5 — 256 ]外的整型、大于0的浮点型、以及列表,集合,元组和字典,当我们引用计数器为0时,应该启用垃圾回收机制回收该内存空间,但实际上python并没有直接回收,“在不同的代码块中(注意)” 而是将对象添加到一个叫 “free_list” 的列表中作为缓存,这个机制就叫做 “free_list机制”。这是做什么呢?这就是为了在以后再创建对象时,不再重新开辟内存,而是使用 free_list 中的内存空间。
举个例子
s1 = 333 (id(s1),内存地址是2253215090224)
del s1 删除s1,则333这个对象的引用技术为0,从refchain链表中删除,将这个类型的内存地址放在了free_list中
s2 = 666 (id(s2),内存地址为2253215090224),指向了在free_list中缓存的地址,只是将内存地址初始化重新赋值放到refchain链表中
但是,对于小于0的浮点数,则不会进入free_list中缓存,而是直接进行回收,创建的时候在开辟内存
1. 元组的缓存机制
元组的缓存利用下标进行,最大索引是20,即元组的元素最大不超过20个,每个索引的链表存储这相同元素数量的对象,每个链表最多存储2000个对象,也就是说(1,2,3,4)和('a','b',1,2)是在相同的索引链表中存储,当一个元组对象被删除或者创建时,他会去和元组中元素个数相同的索引下去寻找是否存在空闲的地址,存在则引用该地址重新赋值即可。
代码结果:
2. 列表的缓存机制
列表和元组的free_list机制不同,列表的缓存数量最多为80个,超出则进行回收
3. 字典的缓存机制
字典的机制和列表是一样的,最多为80个
标签:缓存,Python,list,free,元组,机制,内存地址 From: https://www.cnblogs.com/chf333/p/17115890.html