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使用Flask框架获取当前查询参数的方法
Mar 21 Python
分享python数据统计的一些小技巧
Jul 21 Python
在Django同1个页面中的多表单处理详解
Jan 25 Python
python判断列表的连续数字范围并分块的方法
Nov 16 Python
Python3.5 + sklearn利用SVM自动识别字母验证码方法示例
May 10 Python
python3文件复制、延迟文件复制任务的实现方法
Sep 02 Python
Java Spring项目国际化(i18n)详细方法与实例
Mar 20 Python
解决python DataFrame 打印结果不换行问题
Apr 09 Python
Pytorch 使用CNN图像分类的实现
Jun 16 Python
Python中Yield的基本用法
Oct 18 Python
pytorch 实现在测试的时候启用dropout
May 27 Python
python中validators库的使用方法详解
Sep 23 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
PHP调用Linux的命令行执行文件压缩命令
2013/01/27 PHP
ThinkPHP中create()方法自动验证表单信息
2017/04/28 PHP
js或css实现滚动广告的几种方案
2010/01/28 Javascript
js禁止页面使用右键(简单示例代码)
2013/11/13 Javascript
jQuery对象和DOM对象之间相互转换的方法介绍
2015/02/28 Javascript
JS实现的简单鼠标跟随DiV层效果完整实例
2015/10/31 Javascript
Node.js实现数据推送
2016/04/14 Javascript
JavaScript实现DOM对象选择器
2016/09/24 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(放大缩小)
2016/12/02 Javascript
ajax与json 获取数据并在前台使用简单实例
2017/01/19 Javascript
js阻止移动端页面滚动的两种方法
2017/01/25 Javascript
浅谈原生JS实现jQuery的animate()动画示例
2017/03/08 Javascript
详解vue2父组件传递props异步数据到子组件的问题
2017/06/29 Javascript
集合Bootstrap自定义confirm提示效果
2017/09/19 Javascript
React-Native之定时器Timer的实现代码
2017/10/04 Javascript
Vue中render函数的使用方法
2018/01/31 Javascript
Vue.js的复用组件开发流程完整记录
2018/11/29 Javascript
解决vue初始化项目时,一直卡在Project description上的问题
2019/10/31 Javascript
python解决字典中的值是列表问题的方法
2013/03/04 Python
python生成随机mac地址的方法
2015/03/16 Python
Python安装Flask环境及简单应用示例
2019/05/03 Python
Python利用sqlacodegen自动生成ORM实体类示例
2019/06/04 Python
Django实现WebSSH操作物理机或虚拟机的方法
2019/11/06 Python
TensorFlow 输出checkpoint 中的变量名与变量值方式
2020/02/11 Python
pyCharm 设置调试输出窗口中文显示方式(字符码转换)
2020/06/09 Python
韩国休闲女装品牌网站:ANAIS
2016/08/24 全球购物
大学生毕业自我鉴定范文
2013/09/19 职场文书
移动通信专业自荐信范文
2013/11/12 职场文书
施工资料员岗位职责
2014/01/06 职场文书
毕业留言寄语大全
2014/04/10 职场文书
材料员岗位职责范本
2015/04/11 职场文书
法院答辩状格式
2015/05/22 职场文书
小学六年级班主任工作经验交流材料
2015/11/02 职场文书
vue首次渲染全过程
2021/04/21 Vue.js
Redis特殊数据类型Geospatial地理空间
2022/06/01 Redis
Python安装及建立虚拟环境的完整步骤
2022/06/25 Servers