Python3的缓存机制
数据的在内存中的缓存机制
1、在同一文件(模块)里,变量存储的缓存机制 (仅对python3.6版本负责),3.7以后的缓存机制会有变化
# ### 同一文件中,数据的缓存机制 [python3.6]
# -->Number 部分
# 1.对于整型而言,-5~正无穷范围内的相同值 id一致
var1 = 100
var2 = 100
print(id(var1) , id(var2))
输出:496856384 496856384
var1 = -100
var2 = -100
print(id(var1) ,id(var2))
输出:31312816 31312848
# 2.对于浮点数而言,非负数范围内的相同值 id一致
var1 = 5.78
var2 = 5.78
print(id(var1) , id(var2))
var1 = -6.89
var2 = -6.89
print(id(var1) , id(var2))
# 3.布尔值而言,值相同情况下,id一致 (True False)
var1 = True
var2 = True
print(id(var1),id(var2))
# 4.复数在 实数+虚数 这样的结构中永不相同(只有虚数的情况例外)
var1 = 5-2j
var2 = 5-2j
print(id(var1) , id(var2))
var1 = 9j
var2 = 9j
print(id(var1) , id(var2))
var1 = -9j
var2 = -9j
print(id(var1),id(var2))
# -->容器类型部分
# 5.字符串 和 空元组 相同的情况下,地址相同
var1 = "我"
var2 = "我"
print(id(var1) , id(var2))
var1 = ()
var2 = ()
print(id(var1),id(var2))
# 6.列表,元组,字典,集合无论什么情况 id标识都不同 [空元组例外]
var1 = [1,2,3]
var2 = [1,2,3]
print(id(var1) , id(var2))
输出:37564552 37564616
var1 = (1,2,3)
var2 = (1,2,3)
print(id(var1),id(var2))
2、不同文件(模块)里,部分数据驻留小数据池中 (仅对python3.6版本负责 了解)
小数据池只针对:int,str,bool,空元祖(),None关键字 这些数据类型有效
(1)对于int而言python在内存中创建了-5 ~ 256 范围的整数,提前驻留在了内存的一块区域,如果是不同文件(模块)的两个变量,声明同一个值,在-5~256这个范围里,
那么id一致.让两个变量的值都同时指向一个值的地址,节省空间。
(2)对于str来说:
1.字符串的长度为0或者1,默认驻留小数据池
2.字符串的长度>1,且只含有大小写字母,数字,下划线时,默认驻留小数据池
3.用*号得到的字符串,分两种情况。
1)乘数等于1时: 无论什么字符串 * 1 , 都默认驻留小数据池
2)乘数大于1时: 乘数大于1,仅包含数字,字母,下划线时会被缓存,但字符串长度不能大于20
(3)指定驻留
可以指定任意字符串加入到小数据池中,无论声明多少个变量,只要此值相同,都指向同一个地址空间
# 从 sys模块 引入 intern 函数 让a,b两个变量指向同一个值
from sys import intern
a = intern('大帅锅&*^^1234'*10)
b = intern('大帅锅&*^^1234'*10)
print(a is b)
print(id(a),id(b))
输出:
True
6105752 6105752
3、 缓存机制的意义
无论是变量缓存机制还是小数据池的驻留机制,都是为了节省内存空间,提升代码效率