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中for语句简单遍历数据的方法
May 07 Python
各种Python库安装包下载地址与安装过程详细介绍(Windows版)
Nov 02 Python
Python3实现抓取javascript动态生成的html网页功能示例
Aug 22 Python
python实现list由于numpy array的转换
Apr 04 Python
mac 安装python网络请求包requests方法
Jun 13 Python
pyQt4实现俄罗斯方块游戏
Jun 26 Python
深入理解python中sort()与sorted()的区别
Aug 29 Python
利用python-docx模块写批量生日邀请函
Aug 26 Python
tensorflow查看ckpt各节点名称实例
Jan 21 Python
pytorch实现从本地加载 .pth 格式模型
Feb 14 Python
Django实现celery定时任务过程解析
Apr 21 Python
Python sklearn中的.fit与.predict的用法说明
Jun 28 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识别二维码的方法(php-zbarcode安装与使用)
2016/07/07 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
根据分辨率不同,调用不同的css文件
2006/08/25 Javascript
JavaScript为对象原型prototype添加属性的两种方式
2010/08/01 Javascript
基于jQuery的为attr添加id title等效果的实现代码
2011/04/20 Javascript
jQuery元素的隐藏与显示实例
2015/01/20 Javascript
Javascript获取数组中的最大值和最小值的方法汇总
2016/01/01 Javascript
基于slideout.js实现移动端侧边栏滑动特效
2016/11/28 Javascript
Angularjs实现分页和分页算法的示例代码
2016/12/23 Javascript
详解用Node.js写一个简单的命令行工具
2018/03/01 Javascript
使用Angular CLI快速创建Angular项目的一些基本概念和写法小结
2018/04/22 Javascript
深入浅析Vue中的Prop
2018/06/10 Javascript
详解vue数组遍历方法forEach和map的原理解析和实际应用
2018/11/15 Javascript
Angular7.2.7路由使用初体验
2019/03/01 Javascript
el-input 标签中密码的显示和隐藏功能的实例代码
2019/07/19 Javascript
使用Vue.js中的过滤器实现幂方求值的方法
2019/08/27 Javascript
在vue中使用axios实现post方式获取二进制流下载文件(实例代码)
2019/12/16 Javascript
JS实现可以用键盘方向键控制的动画
2020/12/11 Javascript
javascript实现点击产生随机图形
2021/01/25 Javascript
Python递归函数实例讲解
2019/02/27 Python
使用celery执行Django串行异步任务的方法步骤
2019/06/06 Python
windows下安装Python虚拟环境virtualenvwrapper-win
2019/06/14 Python
python基于TCP实现的文件下载器功能案例
2019/12/10 Python
HTML5拖放效果的实现代码
2016/11/17 HTML / CSS
澳大利亚在线性感内衣商店:Fantasy Lingerie
2021/02/07 全球购物
同步和异步有何异同,在什么情况下分别使用他们
2013/04/09 面试题
汽车驾驶求职信
2013/10/25 职场文书
服务员自我评价
2014/01/25 职场文书
领导班子三严三实对照检查材料
2014/09/25 职场文书
房屋租赁协议书
2014/10/18 职场文书
家属慰问信
2015/02/14 职场文书
《老人与海鸥》教学反思
2016/02/16 职场文书
2016优秀大学生个人事迹材料范文
2016/03/01 职场文书
MySQL中的布尔值,怎么存储false或true
2021/06/04 MySQL
解决vue中provide inject的响应式监听
2022/04/19 Vue.js
MySQL导致索引失效的几种情况
2022/06/25 MySQL