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+微信接口实现运维报警
Aug 27 Python
python实现协同过滤推荐算法完整代码示例
Dec 15 Python
Python实现全排列的打印
Aug 18 Python
解决python "No module named pip" 的问题
Oct 13 Python
Python设计模式之原型模式实例详解
Jan 18 Python
python添加模块搜索路径和包的导入方法
Jan 19 Python
用python生成与调用cntk模型代码演示方法
Aug 26 Python
Python实现打印实心和空心菱形
Nov 23 Python
Python如何实现机器人聊天
Sep 10 Python
python使用bs4爬取boss直聘静态页面
Oct 10 Python
Python基于callable函数检测对象是否可被调用
Oct 16 Python
解决pycharm导入numpy包的和使用时报错:RuntimeError: The current Numpy installation (‘D:\\python3.6\\lib\\site-packa的问题
Dec 08 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
基于mysql的bbs设计(一)
2006/10/09 PHP
Smarty+QUICKFORM小小演示
2007/02/25 PHP
备份mysql数据库的php代码(一个表一个文件)
2010/05/28 PHP
PHP面向对象之后期静态绑定功能介绍
2015/05/18 PHP
支付宝服务窗API接口开发php版本
2016/07/20 PHP
PHP sleep()函数, usleep()函数
2016/08/25 PHP
PHP命令Command模式用法实例分析
2018/08/08 PHP
laravel 数据验证规则详解
2019/10/23 PHP
Jquey拖拽控件Draggable使用方法(asp.net环境)
2010/09/28 Javascript
textarea中的手动换行处理的jquery代码
2011/02/26 Javascript
javascript重写alert方法的实例代码
2013/03/29 Javascript
jquery插件jquery.dragscale.js实现拖拽改变元素大小的方法(附demo源码下载)
2016/02/25 Javascript
jQuery动态增减行的实例代码解析(推荐)
2016/12/05 Javascript
js 去掉字符串前后空格实现代码集合
2017/03/25 Javascript
Nodejs中使用captchapng模块生成图片验证码
2017/05/18 NodeJs
深入掌握 react的 setState的工作机制
2017/09/27 Javascript
javascript基本常用排序算法解析
2017/09/27 Javascript
在Vue组件上动态添加和删除属性方法
2018/02/23 Javascript
详解微信小程序文件下载--视频和图片
2019/04/24 Javascript
ES6学习笔记之字符串、数组、对象、函数新增知识点实例分析
2020/01/22 Javascript
Python的print用法示例
2014/02/11 Python
python 远程统计文件代码分享
2015/05/14 Python
python提取包含关键字的整行数据方法
2018/12/11 Python
Python3 实现串口两进程同时读写
2019/06/12 Python
Python二维数组实现求出3*3矩阵对角线元素的和示例
2019/11/29 Python
使用Django清空数据库并重新生成
2020/04/03 Python
简单了解Python多态与属性运行原理
2020/06/15 Python
工程项目经理岗位职责
2013/12/15 职场文书
先进个人事迹材料
2014/01/25 职场文书
2014年群众路线党员自我评议
2014/09/24 职场文书
2015元旦家电促销活动策划方案
2014/12/09 职场文书
CSS3实现三角形不断放大效果
2021/04/13 HTML / CSS
纯CSS实现酷炫的霓虹灯效果
2021/04/13 HTML / CSS
MySQL系列之三 基础篇
2021/07/02 MySQL
MySQL定时备份数据库(全库备份)的实现
2021/09/25 MySQL
Android自定义scrollview实现回弹效果
2022/04/01 Java/Android