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中文编码那些事
Jun 25 Python
Python中isnumeric()方法的使用简介
May 19 Python
Django中对通过测试的用户进行限制访问的方法
Jul 23 Python
Python语言的面相对象编程方式初步学习
Mar 12 Python
Python 自动化表单提交实例代码
Jun 08 Python
Ubuntu16.04/树莓派Python3+opencv配置教程(分享)
Apr 02 Python
python 读取Linux服务器上的文件方法
Dec 27 Python
Python使用ctypes调用C/C++的方法
Jan 29 Python
python交互界面的退出方法
Feb 16 Python
使用Python实现毫秒级抢单功能
Jun 06 Python
使用python求斐波那契数列中第n个数的值示例代码
Jul 26 Python
如何用Matlab和Python读取Netcdf文件
Feb 19 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
谈一谈收音机的高放电路
2021/03/02 无线电
PHP中的MYSQL常用函数(php下操作数据库必备)
2010/09/12 PHP
解析获取优酷视频真实下载地址的PHP源代码
2013/06/26 PHP
PHP实现简单搜歌的方法
2015/07/28 PHP
PHP实现Redis单据锁以及防止并发重复写入
2018/04/10 PHP
JsEasy简介 JsEasy是什么?与下载
2007/03/07 Javascript
Javascript this关键字使用分析
2008/10/21 Javascript
ext checkboxgroup 回填数据解决
2009/08/21 Javascript
超级24小时弹窗代码 24小时退出弹窗代码 100%弹窗代码(IE only)
2010/06/11 Javascript
javascript中将Object转换为String函数代码 (json str)
2012/04/29 Javascript
js string 转 int 注意的问题小结
2013/08/15 Javascript
js加载读取内容及显示与隐藏div示例
2014/02/13 Javascript
javascript中为某个元素指定事件的三种方式
2014/08/07 Javascript
十大热门的JavaScript框架和库
2017/03/21 Javascript
vue观察模式浅析
2018/09/25 Javascript
解决echarts的多个折现数据出现坐标和值对不上的问题
2018/12/28 Javascript
jQuery实现简单弹幕效果
2019/11/28 jQuery
详解Vue.js 响应接口
2020/07/04 Javascript
vue动态加载SVG文件并修改节点数据的操作代码
2020/08/17 Javascript
[05:36]DOTA2 2015国际邀请赛中国区预选赛第四日TOP10
2015/05/29 DOTA
[01:42]辉夜杯战队访谈宣传片—FANTUAN
2015/12/25 DOTA
用python实现k近邻算法的示例代码
2018/09/06 Python
使用python实现对元素的长截图功能
2019/11/14 Python
浅谈python输出列表元素的所有排列形式
2020/02/26 Python
Windows+Anaconda3+PyTorch+PyCharm的安装教程图文详解
2020/04/03 Python
python基本算法之实现归并排序(Merge sort)
2020/09/01 Python
Python‘==‘ 及 ‘is‘相关原理解析
2020/09/05 Python
澳大利亚在线生活方式商店:Mytopia
2018/07/08 全球购物
Paul Smith英国官网:英国国宝级时装品牌
2019/03/21 全球购物
个人求职信范文分享
2014/01/31 职场文书
护士毕业生自荐信
2014/02/07 职场文书
12.4全国法制宣传日活动总结
2014/11/01 职场文书
先进单位事迹材料
2014/12/25 职场文书
2016年教师新年寄语
2015/08/18 职场文书
小学生教师节广播稿
2015/08/19 职场文书
英国数字版游戏销量周榜公布 《小缇娜的奇幻之地》登顶
2022/04/03 其他游戏