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将xml xsl文件生成html文件存储示例讲解
Dec 03 Python
django模型中的字段和model名显示为中文小技巧分享
Nov 18 Python
Python实现二分查找算法实例
May 26 Python
Python中的字符串类型基本知识学习教程
Feb 04 Python
Python使用pyh生成HTML文档的方法示例
Mar 10 Python
python 统计列表中不同元素的数量方法
Jun 29 Python
python实现淘宝秒杀脚本
Jun 23 Python
基于python生成器封装的协程类
Mar 20 Python
Python使用matplotlib绘制三维参数曲线操作示例
Sep 10 Python
Django使用消息提示简单的弹出个对话框实例
Nov 15 Python
探秘TensorFlow 和 NumPy 的 Broadcasting 机制
Mar 13 Python
Django使用channels + websocket打造在线聊天室
May 20 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的朋友 经常问的一些问题。不断更新
2011/08/11 PHP
PHP获取一个字符串中间一部分字符的方法
2014/08/19 PHP
destoon文章模块调用企业会员资料的方法
2014/08/22 PHP
微信公众号点击菜单即可打开并登录微站的实现方法
2014/11/14 PHP
Javascript-Mozilla和IE中的一个函数直接量的问题分析
2007/08/12 Javascript
jQuery1.6 使用方法一
2011/11/23 Javascript
js防止表单重复提交的两种方法
2013/09/30 Javascript
javascript常见操作汇总
2014/09/03 Javascript
jQuery对象与DOM对象之间的相互转换
2015/03/03 Javascript
AngularJS中的缓存使用
2017/01/11 Javascript
详解闭包解决jQuery中AJAX的外部变量问题
2017/02/22 Javascript
jQuery Json数据格式排版高亮插件json-viewer.js使用方法详解
2017/06/12 jQuery
javaScript 连接打印机,打印小票的实例
2017/12/29 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(上)
2018/04/18 Javascript
JS实现将二维数组转为json格式字符串操作示例
2018/07/12 Javascript
Python实现合并字典的方法
2015/07/07 Python
Python3实现并发检验代理池地址的方法
2016/09/18 Python
python和ruby,我选谁?
2017/09/13 Python
详解如何使用Python编写vim插件
2017/11/28 Python
Python实现连接postgresql数据库的方法分析
2017/12/27 Python
使用Python的OpenCV模块识别滑动验证码的缺口(推荐)
2019/05/10 Python
解决python 上传图片限制格式问题
2019/10/30 Python
Python如何使用内置库matplotlib绘制折线图
2020/02/24 Python
Pycharm配置PyQt5环境的教程
2020/04/02 Python
python能做哪方面的工作
2020/06/15 Python
python 实现的车牌识别项目
2021/01/25 Python
CSS3教程(1):什么是CSS3
2009/04/02 HTML / CSS
使用CSS实现弹性视频html5案例实践
2012/12/26 HTML / CSS
土木工程实习生自我鉴定
2013/09/19 职场文书
大学生毕业的自我鉴定
2013/11/13 职场文书
英文自荐信格式
2013/11/28 职场文书
社区网格化管理实施方案
2014/03/21 职场文书
平安工地汇报材料
2014/08/19 职场文书
初二学生评语大全
2014/12/26 职场文书
Oracle设置DB、监听和EM开机启动的方法
2021/04/25 Oracle
Jupyter Notebook 如何修改字体和大小以及更改字体样式
2021/06/03 Python