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 相关文章推荐
使用Mixin设计模式进行Python编程的方法讲解
Jun 21 Python
Pycharm学习教程(7)虚拟机VM的配置教程
May 04 Python
Python实现在线暴力破解邮箱账号密码功能示例【测试可用】
Sep 06 Python
Python中enumerate()函数编写更Pythonic的循环
Mar 06 Python
用python一行代码得到数组中某个元素的个数方法
Jan 28 Python
Python3利用print输出带颜色的彩色字体示例代码
Apr 08 Python
python禁用键鼠与提权代码实例
Aug 16 Python
PyTorch中常用的激活函数的方法示例
Aug 20 Python
解决pycharm启动后总是不停的updating indices...indexing的问题
Nov 27 Python
Python如何把十进制数转换成ip地址
May 25 Python
PyCharm2020.1.1与Python3.7.7的安装教程图文详解
Aug 07 Python
Python通过类的组合模拟街道红绿灯
Sep 16 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实现简单数字分页效果
2015/07/26 PHP
PHP 计算至少是其他数字两倍的最大数的实现代码
2020/05/26 PHP
js将控件隐藏的方法及display属性介绍
2013/07/04 Javascript
js控制href内容的连接内容的变化示例
2014/04/30 Javascript
javascript实现图片循环渐显播放的方法
2015/02/24 Javascript
Js实现无刷新删除内容
2015/04/29 Javascript
JS实现仿QQ效果的三级竖向菜单
2015/09/25 Javascript
AngularJS equal比较对象实例详解
2016/09/14 Javascript
概述jQuery中的ajax方法
2016/12/16 Javascript
js判断一个字符串是以某个字符串开头的简单实例
2016/12/27 Javascript
JavaScript Date 知识浅析
2017/01/29 Javascript
在点击div中的p时,如何阻止事件冒泡
2017/02/07 Javascript
vue音乐播放器插件vue-aplayer的配置及其使用实例详解
2017/07/10 Javascript
JavaScript实现三级联动效果
2017/07/15 Javascript
详解使用nvm管理多版本node的方法
2017/08/30 Javascript
浅谈微信JS-SDK 微信分享接口开发(介绍版)
2018/08/15 Javascript
JavaScript中.min.js和.js文件的区别讲解
2019/02/13 Javascript
js实现带搜索功能的下拉框
2020/01/11 Javascript
webpack 动态批量加载文件的实现方法
2020/03/19 Javascript
[02:22:36]《加油!DOTA》总决赛
2014/09/19 DOTA
给Python初学者的一些编程技巧
2015/04/03 Python
简单谈谈python中的语句和语法
2017/08/10 Python
python函数局部变量、全局变量、递归知识点总结
2019/11/15 Python
python 实现按对象传值
2019/12/26 Python
Python pip配置国内源的方法
2020/02/14 Python
python工具快速为音视频自动生成字幕(使用说明)
2021/01/27 Python
CSS3+JavaScript实现炫酷呼吸效果的示例代码
2020/06/15 HTML / CSS
size?德国官方网站:英国伦敦的球鞋精品店
2018/03/17 全球购物
学校岗位设置方案
2014/01/16 职场文书
营销总监岗位职责范本
2014/02/26 职场文书
yy司仪主持词
2014/03/22 职场文书
乡镇保密工作责任书
2014/07/28 职场文书
小学生三分钟演讲稿
2014/08/18 职场文书
2015年初中元旦晚会活动总结
2014/11/28 职场文书
OpenCV项目实践之停车场车位实时检测
2022/04/11 Python
Win11右下角图标点了没反应怎么办?Win11点击右下角图标无反应解决方法汇总
2022/07/07 数码科技