Python中整数的缓存机制讲解

 更新时间:2019年02月16日 11:00:20   作者:baidu20008  
今天小编就为大家分享一篇关于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在整数缓冲池中组织为一个节点或两个节点没有什么本质区别吧(除了浪费了一点内存)。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • Python3安装tensorflow及配置过程

    Python3安装tensorflow及配置过程

    TensorFlow 是一个端到端开源机器学习平台,能够帮助开发者快速轻松的构建和部署由机器学习提供应用,对Python3安装tensorflow的相关知识感兴趣的朋友一起学习下吧
    2021-05-05
  • python 移除字符串尾部的数字方法

    python 移除字符串尾部的数字方法

    今天小编就为大家分享一篇python 移除字符串尾部的数字方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • python实现将内容分行输出

    python实现将内容分行输出

    本文给大家分享的是使用python实现将一行里的内容进行分行输出,一共给出了四种方法,小伙伴们可以参考下
    2015-11-11
  • NoSql数据库介绍及使用Python连接MongoDB

    NoSql数据库介绍及使用Python连接MongoDB

    MongoDB是一个非常流行的NoSQL数据库,常用于大规模数据存储应用,下面这篇文章主要给大家介绍了关于NoSql数据库及使用Python连接MongoDB的相关资料,需要的朋友可以参考下
    2023-06-06
  • 解决python DataFrame 打印结果不换行问题

    解决python DataFrame 打印结果不换行问题

    这篇文章主要介绍了解决python DataFrame 打印结果不换行问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • Python使用Flask Migrate模块迁移数据库

    Python使用Flask Migrate模块迁移数据库

    Flask-Migrate是一个为Flask应用处理SQLAlchemy数据库迁移的扩展,使得可以通过Flask的命令行接口或者Flask-Scripts对数据库进行操作
    2022-07-07
  • Anaconda使用IDLE的实现示例

    Anaconda使用IDLE的实现示例

    这篇文章主要介绍了Anaconda使用IDLE的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Python数据分析之 Pandas Dataframe条件筛选遍历详情

    Python数据分析之 Pandas Dataframe条件筛选遍历详情

    这篇文章主要介绍了Python数据分析之 Pandas Dataframe条件筛选遍历详情,查询Pandas Dataframe数据时,经常会筛选出符合条件的数据,关于其使用方式,需要的小伙伴可以参考一下下面文章内容
    2022-05-05
  • 对python中xlsx,csv以及json文件的相互转化方法详解

    对python中xlsx,csv以及json文件的相互转化方法详解

    今天小编就为大家分享一篇对python中xlsx,csv以及json文件的相互转化方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Python装饰器简单用法实例小结

    Python装饰器简单用法实例小结

    这篇文章主要介绍了Python装饰器简单用法,结合实例形式总结分析了Python装饰器的基本功能、简单用法及相关操作注意事项,需要的朋友可以参考下
    2018-12-12

最新评论