Python中整数的缓存机制讲解
作者:baidu20008 发布时间:2021-12-24 12:35:46
在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


猜你喜欢
- 本文实例讲述了GO语言Defer用法。分享给大家供大家参考。具体分析如下:defer:调用一个被 defer 的函数时在函数刚要返回之前延迟
- 利用map和reduce编写一个str2float函数,把字符串'123.456'转换成浮点数123.456from fun
- 在python中对一个元组排序我的同事Axel Hecht 给我展示了一些我所不知道的关于python排序的东西。 在python里你可以对
- 本文实例讲述了JavaScript中String.prototype用法。分享给大家供大家参考。具体如下:// 返回字符的长度,一个中文算2
- 一、分析阶段 一般来说,在系统分析阶段往往有太多需要关注的地方,系统各种功能性、可用性、可靠性、安全性需求往往吸引了我们大部分的注意力,但是
- Django提供了一个新的类来帮助你管理分页数据,这个类存放在django/core/paginator.py.它可以接收列表、元组或其它可
- context 有什么作用context 主要用来在goroutine 之间传递上下文信息,包括:取消信号、超时时间、截止时间、k-v 等。
- 目录信号:官方介绍:blinker 使用命名信号匿名信号组播信号接收方订阅主题装饰器用法可订阅主题的装饰器检查信号是否有接收者检查订阅者是否
- 我们在进行程序操作的时候,因为各种原因,需要通过不同的形式返回到之前的对象。不知道小伙伴们会几种返回的函数方法呢?今天要介绍的是findal
- 本来是想从网上找找有没有现成的爬取空气质量状况和天气情况的爬虫程序,结果找了一会儿感觉还是自己写一个吧。主要是爬取北京包括北京周边省会城市的
- 传统来说,大家在CSS中使用的颜色要么是16进制格式,要么是rgb格式,就像rgb(171,205,239)。CSS3带来了一些新的处理颜色
- 仿射密码Affine Cipher是Multiplicative Cipher和Caesar Cipher算法的组合.仿射密码的基本实现如下
- 本文为大家分享了python搭建服务器实现两个Android客户端间收发消息,供大家参考,具体内容如下python服务器# coding:u
- 创建工程时,选择已存在的环境(不要选择虚拟环境,虽然安全,但很慢)添加环境在 anaconda3/bin/python3.6 即 d:/an
- 哎,以前写博文的时候没注意,有些图片用QQ来截取,获得的图片文件名都是类似于QQ截图20120926174732-300×15.png的形式
- sqlalchemy的常用数据类型数据类型python数据类型说明Integerint整形Stringstr字符串Floatfloat浮点型
- 如果在prop中传的值为一个没有使用特殊命名规则的变量如:(type),可以顺利传值:<code class="langua
- 一、pip简介Pip 是安装python包的工具,提供了安装包,列出已经安装的包,升级包以及卸载包的功能。Pip 是对easy_instal
- 如下所示:Numpy中reshape的使用方法为:numpy.reshape(a, newshape, order='C')
- python 不能写new_loss=old_loss=[]这样 两个变量实际上是同一个list要分开写new_loss=[]Old_los