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】

posted @ 2020-12-09 14:23  rm-rf*  阅读(1500)  评论(2编辑  收藏  举报