python中内存管理机制(Python中整数的缓存机制讲解)
python中内存管理机制
Python中整数的缓存机制讲解在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在整数缓冲池中组织为一个节点或两个节点没有什么本质区别吧(除了浪费了一点内存)。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对开心学习网的支持。如果你想了解更多相关内容请查看下面相关链接
原文链接:https://blog.csdn.net/baidu20008/article/details/22432247
- python对字典值排序(Python实现字典按key或者value进行排序操作示例sorted)
- wxpython 弹出对话框显示图片(WxPython建立批量录入框窗口)
- pythonhttp文件服务器(使用Python创建简单的HTTP服务器的方法步骤)
- python爬虫爬取网页信息教程(python爬虫爬取微博评论案例详解)
- python默认缩进设置(不归路系列:Python入门之旅-一定要注意缩进!!!推荐)
- python中怎么查看函数的用法(Python中函数的基本定义与调用及内置函数详解)
- python解析身份证号(python验证身份证信息实例代码)
- python关闭程序强制退出线程(python多线程调用exit无法退出的解决方法)
- python加密与解密(python实现简单加密解密机制)
- python怎样看字符unicode编码(Python3中编码与解码之Unicode与bytes的讲解)
- pythontkinter项目界面(python Tkinter版学生管理系统)
- pythonjpg转pdf格式(Python使用到第三方库PyMuPDF图片与pdf相互转换)
- python栈和队列(Python 实现数据结构中的栈队列)
- python实现两个变量的交换(在Python 中同一个类两个函数间变量的调用方法)
- python中比较同一字典value(在Python 字典中一键对应多个值的实例)
- python解析excel例子(Python玩转Excel的读写改实例)
- 金球奖只青睐那些会戴珠宝的女人(金球奖只青睐那些会戴珠宝的女人)
- 浙江省一个县,人口超40万,建县历史超1100年(浙江省一个县人口超40万)
- 五代十国南唐历代国君(五代十国南唐历代国君)
- 飞机引进工程师杨隆 匠人匠心,只争朝夕(飞机引进工程师杨隆)
- 三人行,她们是育人路上的 铁三角 团队(她们是育人路上的)
- 阴阳师 孟婆山兔CP不倒 新皮肤草稿 孟婆兔 让痒痒鼠点赞(阴阳师孟婆山兔CP不倒)
热门推荐
- nginx代理转发域名(Nginx域名转发使用场景代码实例)
- php实战小实例(php实现推荐功能的简单实例)
- mysql not exists用法(mysql中EXISTS和IN的使用方法比较)
- vue3封装table组件(Vue封装通用table组件的完整步骤记录)
- ASP.NET写文件的方法
- sqlserver数据库中锁的4种类型(SQLSERVER对加密的存储过程、视图、触发器进行解密推荐)
- 云服务器怎么上传16g文件(云服务器怎么上传下载文件?)
- react源码教程(详解React 代码共享最佳实践方式)
- css弹出框特效(利用CSS实现酷炫的下拉框特效)
- tensorflow做识别分类(使用TensorFlow实现二分类的方法示例)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9