Python中整数的缓存机制讲解


Posted in Python onFebruary 16, 2019

在python中,如下代码结果一定不会让你吃惊:

Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:06:53) [MSC v.1600 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> a=345
>>> b=a
>>> a is b
True
>>>

没错,在python一切皆是对象,而对象是通过引用传递的。在赋值时,不管这个对象是新创建的,还是一个已经存在的,都是将该对象的引用赋值给变量。故这里a实际上和b是同一个对象,a is b为true!

当然稍为了解python的人我相信都会知道以上相关知识的。但是如下的代码结果,却让人不大好理解了:

>>> c=256
>>> d=256
>>> c is d
True
>>> e=257
>>> f=257
>>> e is f
False
>>>

我们将c赋值为了整型值256,d也为256,e为257,f为257。但是当把c与d,e与f进行is操作时,却发现两者的结果不同。

原因在哪?

——这个是由python中的整型对象的缓冲池机制,所决定的。

在python中几乎所有的内建对象,都会有自己所特有的对象池机制。

1.小整数对象——小整型对象池

在实际编程中,数值比较小的整数,比如1,2,29等,可能会非常频繁的出现。而在python中,所有的对象都存在与系统堆上。想想?如果某个小整数出现的次数非常多,那么python将会出现大量的malloc/free操作,这样大大降低了运行效率,而且会造成大量的内存碎片,严重影响Python的整体性能。

在python2.5乃至3.3中,将小整数位于[-5,257)之间的数,缓存在小整型对象池中。

这也就是为了c is d而e is not f的原因了。

2.大整数对象——通用整数对象池

由以上知,python把小整型数完全的缓存在了小对象缓存池中了。而那些大整数对象就没有那么好的待遇了!python运行环境提供了一块内存空间供大整数轮流使用。通常称为通用整数对象池。这也就是说大整数其实也是有缓存的。该对象池使用链表组织,虽然e和f有着相同的值,但是在链表中确是不同的节点。也就是说e和f根本不是一个对象。至于既然有缓存,为什么e和f还要组织为两个节点,就不大明白了。

讲讲我的看法吧:我觉得从语义上来讲e=257和f=257本身就是应当为两个不同的对象(这点和对象赋值不同)。由于整数缓存池的存在,让大家觉得任何整数在缓冲池中都只能存在一个,不能重复。但将e和f在整数缓冲池中组织为一个节点或两个节点没有什么本质区别吧(除了浪费了一点内存)。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
在Python的web框架中编写创建日志的程序的教程
Apr 30 Python
Python中的hypot()方法使用简介
May 18 Python
Python正则捕获操作示例
Aug 19 Python
python爬虫headers设置后无效的解决方法
Oct 21 Python
利用Pandas 创建空的DataFrame方法
Apr 08 Python
Pandas统计重复的列里面的值方法
Jan 30 Python
python使用Plotly绘图工具绘制水平条形图
Mar 25 Python
Python将列表数据写入文件(txt, csv,excel)
Apr 03 Python
详解Python中pandas的安装操作说明(傻瓜版)
Apr 08 Python
python使用pygame模块实现坦克大战游戏
Mar 25 Python
python处理写入数据代码讲解
Oct 22 Python
彻底解决Python包下载慢问题
Nov 15 Python
Python实现的爬取百度文库功能示例
Feb 16 #Python
对Python3 序列解包详解
Feb 16 #Python
对Python3 pyc 文件的使用详解
Feb 16 #Python
Python父目录、子目录的相互调用方法
Feb 16 #Python
python 获得任意路径下的文件及其根目录的方法
Feb 16 #Python
Python通过for循环理解迭代器和生成器实例详解
Feb 16 #Python
Python3 导入上级目录中的模块实例
Feb 16 #Python
You might like
解析使用ThinkPHP应该掌握的调试手段
2013/06/20 PHP
php/js获取客户端mac地址的实现代码
2013/07/08 PHP
php获取操作系统语言代码
2013/11/04 PHP
PHP限制页面只能在微信自带浏览器访问的代码
2014/01/15 PHP
PHP模板引擎Smarty的缓存使用总结
2014/04/24 PHP
php命令行用法入门实例教程
2014/10/27 PHP
PHP中的静态变量及static静态变量使用详解
2015/11/05 PHP
Laravel5权限管理方法详解
2016/07/26 PHP
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
javascript 跳转代码集合
2009/12/03 Javascript
打开新窗口关闭当前页面不弹出关闭提示js代码
2013/03/18 Javascript
JavaScript—window对象使用示例
2013/12/09 Javascript
node.js下LDAP查询实例分享
2015/09/30 Javascript
解决jquery插件:TypeError:$.browser is undefined报错的方法
2015/11/21 Javascript
AngularJS使用ng-class动态增减class样式的方法示例
2017/05/18 Javascript
vue实现学生录入系统之添加删除功能
2018/07/11 Javascript
Vue-cli@3.0 插件系统简析
2018/09/05 Javascript
jQuery实现基本动画效果的方法详解
2018/09/06 jQuery
vue.js实现的全选与全不选功能示例【基于elementui】
2018/12/03 Javascript
小程序云开发之用户注册登录
2019/05/18 Javascript
微信小程序批量上传图片到七牛(推荐)
2019/12/19 Javascript
小程序卡片切换效果组件wxCardSwiper的实现
2020/02/13 Javascript
解密Python中的描述符(descriptor)
2015/06/03 Python
对python-3-print重定向输出的几种方法总结
2018/05/11 Python
python 实现语音聊天机器人的示例代码
2018/12/02 Python
使用python实现名片管理系统
2020/06/18 Python
Python变量格式化输出实现原理解析
2020/08/06 Python
详解matplotlib中pyplot和面向对象两种绘图模式之间的关系
2021/01/22 Python
CSS3线性渐变简单实现以及该属性在浏览器中的不同
2012/12/12 HTML / CSS
技校学生个人职业生涯规划范文
2014/03/03 职场文书
出纳担保书范文
2014/04/02 职场文书
高中生评语大全
2014/04/25 职场文书
研修心得体会
2014/09/04 职场文书
我的职业生涯规划:打造自己的运动帝国
2014/09/18 职场文书
警察正风肃纪剖析材料
2014/10/16 职场文书
送给小学生的暑假礼物!小学生必背99首古诗
2019/07/02 职场文书