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开启线程,在函数中开线程的实例)
- pythonredis使用场景(python redis 删除key脚本的实例)
- python 正则表达式菜鸟教程(详解Python正则表达式re模块)
- python定义dataframe(对python dataframe逻辑取值的方法详解)
- python最火开源项目(5月份Github上Python开源项目排行)
- python的os模块操作(Python OS模块实例详解)
- python数字形式转换详解(Python3.5实现的罗马数字转换成整数功能示例)
- pythondjango后台管理(基于腾讯云服务器部署微信小程序后台服务Python+Django)
- python二叉树是怎么来的(Python二叉树的镜像转换实现方法示例)
- python 多进程读取文件(Python实现的多进程拷贝文件并显示百分比功能示例)
- python装饰器使用说明(详解Python装饰器)
- wxpython 弹出对话框显示图片(WxPython建立批量录入框窗口)
- pythonrequest包设置编码(解决python3中的requests解析中文页面出现乱码问题)
- python扫描服务器端口(Python实现的对本地host127.0.0.1主机进行扫描端口功能示例)
- python内置函数一览表(Python面向对象程序设计构造函数和析构函数用法分析)
- python常用的属性和方法(Python进阶之@property动态属性的实现)
- 郭麒麟(郭麒麟)
- 古人十句 戒骄 名言,醍醐灌顶,受益匪浅(古人十句戒骄名言)
- 《道德经》:功成不局,泰而不骄(道德经:功成不局)
- 每日一典 过江之鲫(每日一典过江之鲫)
- 红色代表什么(红色代表什么意义和象征)
- 菲律宾安全吗(菲律宾安全吗2023)
热门推荐
- extjs XTemplate的实例
- mysql模糊匹配语句(MySQL 数据库 like 语句通配符模糊查询小结)
- js使用canvas(JavaScript canvas实现七彩时钟效果)
- nodejs请求页面(node.js+postman实现模拟HTTP服务器与客户端交互)
- dedecms系统怎么查看(DedeCMS V5.3/V5.5/V5.7 安全设置指南 图文推荐)
- docker正常容器启动失败(Docker容器无法停止删除的解决方案)
- js如何解决iphone异形屏适配(Html5适配iphoneX刘海屏的简单实现)
- 虚拟主机和云服务器有什么区别吗(云服务器和云虚拟主机两者的有什么区别?)
- https服务器怎么打开(网站服务器配置是选HTTP还是HTTPS?)
- 如何在阿里云虚拟主机部署网站(阿里云云虚拟主机更改操作系统流程)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9