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 相关文章推荐
Python3 入门教程 简单但比较不错
Nov 29 Python
跟老齐学Python之??碌某?? target=
Sep 12 Python
详解supervisor使用教程
Nov 21 Python
对TensorFlow中的variables_to_restore函数详解
Jul 30 Python
python批量从es取数据的方法(文档数超过10000)
Dec 27 Python
matplotlib.pyplot绘图显示控制方法
Jan 15 Python
将pip源更换到国内镜像的详细步骤
Apr 07 Python
Python 读取串口数据,动态绘图的示例
Jul 02 Python
Python 使用元类type创建类对象常见应用详解
Oct 17 Python
详解tensorflow2.x版本无法调用gpu的一种解决方法
May 25 Python
初学者学习Python好还是Java好
May 26 Python
python输入中文的实例方法
Sep 14 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
Uchome1.2 1.5 代码学习 common.php
2009/04/24 PHP
PHP 利用AJAX获取网页并输出的实现代码(Zjmainstay)
2012/08/31 PHP
php使用codebase生成随机数
2014/03/25 PHP
thinkPHP5.0框架API优化后的友好性分析
2017/03/17 PHP
可以将word转成html的js代码
2010/04/11 Javascript
WEB 浏览器兼容 推荐收藏
2010/05/14 Javascript
jquery中选择块并改变属性值的方法
2013/07/31 Javascript
javascript数组去重小结
2016/03/07 Javascript
Jquery实现上下移动和排序代码
2016/10/17 Javascript
原生js实现键盘控制div移动且解决停顿问题
2016/12/05 Javascript
微信小程序 textarea 详解及简单使用方法
2016/12/05 Javascript
利用Jquery实现几款漂亮实用的时间轴(附示例代码)
2017/02/15 Javascript
从零学习node.js之搭建http服务器(二)
2017/02/21 Javascript
解决VUEX刷新的时候出现数据消失
2017/07/03 Javascript
解决vue打包项目后刷新404的问题
2018/03/06 Javascript
js事件on动态绑定数据,绑定多个事件的方法
2018/09/15 Javascript
微信小程序实现留言功能
2018/10/31 Javascript
浅谈pycharm出现卡顿的解决方法
2018/12/03 Python
python开发之anaconda以及win7下安装gensim的方法
2019/07/05 Python
Python下应用opencv 实现人脸检测功能
2019/10/24 Python
Python 限定函数参数的类型及默认值方式
2019/12/24 Python
Jupyter打开图形界面并画出正弦函数图像实例
2020/04/24 Python
在线购买廉价折扣书籍和小说:BookOutlet.com
2018/02/19 全球购物
英国顶级水晶珠宝零售商之一:Tresor Paris
2019/04/27 全球购物
高中生毕业自我鉴定
2013/10/10 职场文书
优秀的自荐信要注意哪些
2014/01/03 职场文书
户外用品商店创业计划书
2014/01/29 职场文书
采购类个人求职的自我评价
2014/02/18 职场文书
毕业典礼演讲稿
2014/05/13 职场文书
升职演讲稿范文
2014/05/23 职场文书
国家机关领导干部民主生活会对照检查材料思想汇报
2014/09/17 职场文书
领导莅临指导欢迎词
2015/09/30 职场文书
低端且暴利的线上线下创业项目分享
2019/09/03 职场文书
html5中sharedWorker实现多页面通信的示例代码
2021/05/07 Javascript
Nginx反向代理、重定向
2022/04/13 Servers
Django框架中模型的用法
2022/06/10 Python