Python 对象缓冲池机制

python 中一切皆是对象,对象有三要素: Id,Type,Value

Id:唯一标识一个对象

Type:标识对象的类型

Value:对象的值

a is b 判断 a 对象是否就是 b 对象(通过id来判断)

a == b 判断 a 对象的值是否和 b 对象的值相等(通过value来判断)

我们都知道

x = 1

y = 1 

x == y ###True

x is y ####True

但是为什么

x = 123456

y = 123456

x == y ### True

x is y ### False

通过用id函数查看对象在系统中的内存地址我们可以发现


当为变量赋值大小不同的值时,值相同的不同变量,当值很大时,变量内存地址不相同,Why?

Python是如何分配内存空间的

类型值的内置数据类型,数值型,字符串,列表,字典等都会有自己的对象缓存池,

这样做的好处是,避免了频繁的申请内存,释放内存,这样会极大的降低应用程序的运行速度,还会造成大量的内存碎片。因此提供对象缓存机制是非常重要的。

以int 整型为例介绍python 对象缓存池

python 定义的数值缓存范围是 -5 ~ 257

源码定义如下:

class int "PyObject *" "&PyLong_Type"

[clinic start generated code]*/

/*[clinic end generated code: output=da39a3ee5e6b4b0d input=ec0275e3422a36e3]*/

#ifndef NSMALLPOSINTS

#define NSMALLPOSINTS          257

#endif

#ifndef NSMALLNEGINTS

#define NSMALLNEGINTS          5

#endif

_Py_IDENTIFIER(little);

_Py_IDENTIFIER(big);

/* convert a PyLong of size 1, 0 or -1 to an sdigit */

#define MEDIUM_VALUE(x) (assert(-1 <= Py_SIZE(x) && Py_SIZE(x) <= 1),  \

        Py_SIZE(x) < 0 ? -(sdigit)(x)->ob_digit[0] :  \

            (Py_SIZE(x) == 0 ? (sdigit)0 :                            \

              (sdigit)(x)->ob_digit[0]))

对于-5 ~ 257 范围内的数值, 创建后python 会将其加入缓存池当中,当再次使用时,则直接从缓存池中返回,而不需要申请内存,如果超出了这个范围的数值,则每次都需要申请内存。

当数值在 -5 ~ 257 范围内,内存地址都一样

但是超出了该范围时,python 对于每个数值都需要申请内存,因此内存地址会不一样

版权声明:本文为CSDN博主「lucky404」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/lucky404/article/details/79677248

你可能感兴趣的:(Python 对象缓冲池机制)