python的数据缓存
Python的数据缓存
python 的内置数据类型,数值型,字符串,列表,字典等都会有自己的对象缓存池,
这样做的好处是,避免了频繁的申请内存,释放内存,这样会极大的降低应用程序的运行速度,还会造成大量的内存碎片。因此提供对象缓存机制是非常重要的。
在Python中,字符串和整型对象都是不可变的(immutable)类型
,因此Python会很高效地缓存它们。这样的处理机制能提升Python的性能。因此,我们看到下面示例中str1和str2也都是指向同一块内存地址:
str1='a'
str2='a'
id(str1)==id(str2)
True
当然,对于int(整形)数据也是如此
a=1
b=1
id(a)==id(b)
True
接下来请注意:
a=-7
b=-7
id(a)==id(b)
False
震惊!居然不一样!
str1='aasfasfas'
str2='abcfasfas'
id(str1)==id(str2)
False
字符串也是如此!
解释
Python能够帮我们缓存多少呢?Python2.3简单整数缓存范围是(-1,100),Python2.5.4以后简单整数缓存范围至少是(-5,256)。所有的短字符也都在缓存区,但是tuple()不可以
x = (1,2)
y = (1,2)
id(x) == id(y)
False
这是因为在Python中符号()不仅仅是元组,它被重载为分组操作符,由圆括号()包裹的单一元素首先被当做分组操作,而不是元组
BUG here ??
交互式命令行中运行
a=888
b=888
id(a)==id(b)
False
a is b
False
Pycharm中运行
a = 888
b = 888
print(a is b) >>True
print(id(a) == id(b)) >>True
两种不同的运行方式,第一种是直接采用解释器运行,第二种是把代码当做脚本运行,结果居然不一样
关于这个BUG,经过我多日通宵研究,是这样子的
-
出于性能考虑,Python内部做了进一步优化,怎么优化呢?但凡是在同一个代码块中的代码,如果出现两个值相同的整数,那么它们将被重用
-
上面代码是在一个test.py文件中,运行时,a和b的id值相同,因为a、b 在同一个代码块,属于模块级别,创建 b 的时候,发现同级代码块中有个b的值了,就重用了这个对象。
-
在 Python 的交互式命令行中,每单独一行都视为一个代码块,同一行中的代码属于同一个代码块,因此不难理解,创建b时候无法引用a。
-
换句话说,以文件脚本形式执行的时候,会先将源码翻译为字节码,也就是pyc或者pyo文件,Pythoin解释器会自动重复引用一些变量,以节省内存使用。在控制台执行的时候,代码是以交互形式逐行执行的,解释器不会进行优化,但对于一些常见的数字和字符串,还是会有优化。范围【-5~256】