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 相关文章推荐
剖析Django中模版标签的解析与参数传递
Jul 21 Python
Python OpenCV 直方图的计算与显示的方法示例
Feb 08 Python
python实现求解列表中元素的排列和组合问题
Mar 15 Python
python生成每日报表数据(Excel)并邮件发送的实例
Feb 03 Python
Python面向对象实现一个对象调用另一个对象操作示例
Apr 08 Python
使用Pyinstaller转换.py文件为.exe可执行程序过程详解
Aug 06 Python
对Django中内置的User模型实例详解
Aug 16 Python
Python操作excel的方法总结(xlrd、xlwt、openpyxl)
Sep 02 Python
python 表格打印代码实例解析
Oct 12 Python
详解Python中字符串前“b”,“r”,“u”,“f”的作用
Dec 18 Python
Python使用tkinter实现摇骰子小游戏功能的代码
Jul 02 Python
pycharm使用技巧之自动调整代码格式总结
Nov 04 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
全国FM电台频率大全 - 17 湖北省
2020/03/11 无线电
php递归列出所有文件和目录的代码
2008/09/10 PHP
php木马webshell扫描器代码
2012/01/25 PHP
PHP动态页生成静态页的3种常用方法
2014/11/13 PHP
简单谈谈favicon
2015/06/10 PHP
thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json完整实例
2020/03/02 PHP
VSCode+PHPstudy配置PHP开发环境的步骤详解
2020/08/20 PHP
ScrollDown的基本操作示例
2013/06/09 Javascript
js控制input框只读实现示例
2014/01/20 Javascript
jquery可定制的在线UEditor编辑器
2015/11/17 Javascript
Javascript 6里的4个新语法
2016/08/25 Javascript
vue2.0 实现导航守卫(路由守卫)
2018/05/21 Javascript
微信小程序局部刷新触发整页刷新效果的实现代码
2018/11/21 Javascript
vue模块拖拽实现示例代码
2019/03/09 Javascript
vue+eslint+vscode配置教程
2019/08/09 Javascript
js实现无缝轮播图效果
2020/03/09 Javascript
[01:10:24]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第一场 2月28日
2021/03/11 DOTA
python导入csv文件出现SyntaxError问题分析
2017/12/15 Python
python 将字符串转换成字典dict的各种方式总结
2018/03/23 Python
selenium+PhantomJS爬取豆瓣读书
2019/08/26 Python
python实现12306登录并保存cookie的方法示例
2019/12/17 Python
pytorch读取图像数据转成opencv格式实例
2020/06/02 Python
Python  Asyncio模块实现的生产消费者模型的方法
2021/03/01 Python
HTML5 CSS3给网站设计带来出色效果
2009/07/16 HTML / CSS
HTML5视频播放插件 video.js介绍
2018/09/29 HTML / CSS
美国婴童服装市场上的领先品牌:Carter’s
2018/02/08 全球购物
中国领先的汽车保养服务平台:途虎养车
2019/10/18 全球购物
给同事的道歉信
2014/01/11 职场文书
三年级数学教学反思
2014/01/31 职场文书
预备党员政审材料
2014/02/04 职场文书
高三政治教学反思
2014/02/06 职场文书
优乐美广告词
2014/03/14 职场文书
党员岗位承诺书
2014/03/25 职场文书
2014年文艺部工作总结
2014/11/17 职场文书
穷人该怎么创业?谨记以下几点
2019/07/11 职场文书
PHP新手指南
2021/04/01 PHP