Python缓存重用机制详解

Python 中关于对象内存的分配规则是什么样的呢?其实,有两个重要的机制分别是赋值机制和缓存重用机制,本节重点对缓存重用机制做详细介绍。

下面分别对它们进行介绍:

赋值机制

在 Python 中,等号赋值是指直接将对象的内存指针赋值,示例如下:

x = 23
y = 45
print("x,y:",id(x),id(y),x,y)
x= y
print("x,y:",id(x),id(y),x,y)

执行代码,输出结果如下:

x,y:1725105328 1725106032 23 45
x,y:1725106032 1725106032 45 45

可以看到,x 与 y 在赋值之前各自有自己的指针,而当赋值之后,x 与 y 不仅有相同的值,而且还有相同的指针。

在赋值之前的 x=23 中,1725105328 所指的内存地址去哪了呢?其实这个 23 还在内存中,当系统判断没有变量引用该内存地址时,系统会使用内存回收机制,按设定好的规则回收该部分内存地址。

补充:is函数与“==”的区别是什么呢?

==:表示只是判断两个对象的内容是否相等。
is函数:不仅比较对内容是否相等,还比较指针是否相等。

提示:两个对象如果使用“==”得到的是 true,使用is得到的不一定是 true,因为它们的地址有可能会不同;但是如果使用 is 得到的是 true,使用“==”就会一定是 true,因为它们本身就是一块内存的内容。示例如下:

a = -256
b = -256
print(a==b)   #判断a和b的内容是否相等
print(a is b)  #判断a和b的内存是否相等
print(id(a),id(b))#id的意思是打印出对象的地址

执行代码,输出如下结果:

True
False
151744048 151743312

可以看出虽然 a 和 b 都是 -256,但是它们的地址并不相等。

当然上面的例子只是一个很小的知识点。Python 在优化效率时做了好多工作,这导致存储对象的内存分配有很多隐含的规则。如不了解这些规则,使用 is 函数就会带来很多意想不到的麻烦。因此能使用“==”处理的地方,尽量不要使用 is 函数。

缓存重用机制

在优化整数对象时,Python 会根据对象的读取频繁程度以及内存占用情况来考虑,按照一定规则把某些对象存入缓存中。当程序的其他部分代码使用该值时,系统会先去缓存中查找该值,并直接引用找到的缓存地址,不需要额外创建。

缓存重用机制的规则如下图所示:

图片[1]|Python缓存重用机制详解

下面通过一段程序来演示 Python 缓存具体的规则。

定义两个变量,为它们赋予相同的值,并将这两个变量的指针打印出来,然后分别按照缓存的具体规则分别为它们赋值,观察赋值后的两个变量的指针是否相等。如果相等,则表明在 Python 内部对其使用了缓存机制。

下面代码对上述表格中六种情况做了具体的演示,代码如下所示:

#范围在[-5,256]之间的小整数
int1=-5
int2=-5
print("[-5,256]情况下的两个变量指针",id(int1),id(int2))

#对于字符串
s1="3344"
s2= "3344"
print("字符串情况下的两个变量指针",id(s1),id(s2))

#大于256的整数
int3=257
int4=257
print("大于256的整数情况下的两个变量指针",id(int3),id(int4))

#大于0的浮点数
f1=256.4
f2=256.4
print("大于0的浮点数情况下的两个变量指针",id(f1),id(f2))

#小于0的浮点数
f1=-2.45
f2=-2.45
print("小于0的浮点数情况下的两个变量指针",id(f1),id(f2))

#小于-5的整数
n1=-6
n2=-6
print("小于-5的整数情况下的两个变量指针",id(n1),id(n2))

运行上面的代码后会得到如下的输出:

[-5,256]情况下的两个变量指针 1882718512 1882718512
字符串情况下的两个变量指针 153383856 153383856
大于256的整数情况下的两个变量指针 153472560 153472560
大于0的浮点数情况下的两个变量指针 153023472 153023472
小于0的浮点数情况下的两个变量指针 153023616 153023640
小于-5的整数情况下的两个变量指针 153471792 153471824

大家可以对照着具体的代码情况和打印的指针结果来理解上述表格中“缓存的重用机制”的相应规则,以加深对该部分知识的体会。

© 版权声明
THE END
喜欢就支持一下吧
点赞0赞赏
分享
评论 抢沙发
HarryPotter的头像|艾奇编程网

昵称

取消
昵称表情