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】

最新文章

  1. 【JS】字符串操作
  2. 临床试验中PI、CI、SI、COI是指哪些人?
  3. iOS大神牛人的博客集合
  4. .net微信公众号开发——基础接口
  5. unicode 和 utf-8 的关系和解释
  6. QML学习笔记之三
  7. 网页增重不可控?试试 OneAPM Cloud Test
  8. 去掉cajviewer 右上角的“中国知网数字出版物超市
  9. 30、ADO.NET、事务、DataSet
  10. SDRAM操作(FPGA实现)
  11. css 修改默认滚动条样式
  12. Piggy-Bank 完全背包
  13. 【MySQL】-2 函数、分组、子查询、联合查询
  14. 『Numpy』np.ravel()和np.flatten()
  15. linux下svn导入新目录到svn服务器特定地址
  16. Halcon的C#二次开发及经验分享
  17. python web开发——c5 图片上传 flask-uploads 云储存sdk
  18. javaweb学习5——JSP
  19. python下的select模块使用 以及epoll与select、poll的区别
  20. Javascript 的数据是什么数据类型?

热门文章

  1. Linux程序开发中如何判断目录是否为根目录?
  2. git-新建git用户流程-1
  3. 从 Webpack 到 Snowpack, 编译速度提升十倍以上——TRPG Engine迁移小记
  4. php 进行图片裁剪
  5. phpstorm换行符设置LF
  6. 实时检测微信域名防红拦截检测API系统,最新腾讯域名屏蔽检测官方接口
  7. 对数组进行排序成最小的,相当于自己实现了一次String的compareTo函数,不过是另类的。
  8. layui $().click() 失效问题
  9. Tarjan 算法总结
  10. go特性-数组与切片