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多进程同步Lock、Semaphore、Event实例
Nov 21 Python
python将ip地址转换成整数的方法
Mar 17 Python
Python制作刷网页流量工具
Apr 23 Python
django上传图片并生成缩略图方法示例
Dec 11 Python
好的Python培训机构应该具备哪些条件
May 23 Python
python绘制圆柱体的方法
Jul 02 Python
解决python3中cv2读取中文路径的问题
Dec 05 Python
pytorch中的embedding词向量的使用方法
Aug 18 Python
pygame实现俄罗斯方块游戏(AI篇1)
Oct 29 Python
MNIST数据集转化为二维图片的实现示例
Jan 10 Python
Python Pandas数据分析工具用法实例
Nov 05 Python
如何在Python中创建二叉树
Mar 30 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 session_start()关于Cannot send session cache limiter - headers already sent错误解决方法
2009/11/27 PHP
PHP容易被忽略而出错陷阱 数字与字符串比较
2011/11/10 PHP
php 无法加载mysql的module的时候的配置的解决方案引发的思考
2012/01/27 PHP
深入php函数file_get_contents超时处理的方法详解
2013/06/03 PHP
php实例分享之通过递归实现删除目录下的所有文件详解
2014/05/15 PHP
PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定
2014/06/12 PHP
thinkphp如何获取客户端IP
2015/11/03 PHP
PHP中CheckBox多选框上传失败的代码写法
2017/02/13 PHP
PHP基于SMTP协议实现邮件发送实例代码
2017/04/27 PHP
js 连接数据库如何操作数据库中的数据
2012/11/23 Javascript
jQuery浏览器CSS3特写兼容实例
2015/01/19 Javascript
为JS扩展Array.prototype.indexOf引发的问题及解决办法
2015/01/21 Javascript
js实现屏幕自适应局部代码分享
2015/01/30 Javascript
深入学习JavaScript中的Rest参数和参数默认值
2015/07/28 Javascript
JS组件Bootstrap实现下拉菜单效果代码
2016/04/26 Javascript
详细AngularJs4的图片剪裁组件的实例
2017/07/12 Javascript
利用js给datalist或select动态添加option选项的方法
2018/01/25 Javascript
微信小程序日历效果
2018/12/29 Javascript
Vue前端项目部署IIS的实现
2020/01/06 Javascript
原生js+css调节音量滑块
2020/01/15 Javascript
javascript 易错知识点实例小结
2020/04/25 Javascript
Node.js API详解之 util模块用法实例分析
2020/05/09 Javascript
[01:14:12]2018DOTA2亚洲邀请赛4.7 总决赛 LGD vs Mineski 第二场
2018/04/09 DOTA
举例讲解Python中的list列表数据结构用法
2016/03/12 Python
python入门教程之识别验证码
2017/03/04 Python
Django项目中实现使用qq第三方登录功能
2019/08/13 Python
Python 字典一个键对应多个值的方法
2020/09/29 Python
Python urllib库如何添加headers过程解析
2020/10/05 Python
next在python中返回迭代器的实例方法
2020/12/15 Python
美国电子产品主要品牌的授权在线零售商:DataVision
2019/03/23 全球购物
大学生应聘自荐信
2013/10/11 职场文书
2014春晚主持词
2014/03/25 职场文书
演讲稿的写法
2014/05/19 职场文书
贫困证明书格式及范文
2014/10/15 职场文书
2015年酒店服务员工作总结
2015/05/18 职场文书
企业法人代表证明书
2015/06/18 职场文书