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

标签:python,整数,缓存机制
0
投稿

猜你喜欢

  • PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程

    2023-11-19 20:31:59
  • Pyqt QImage 与 np array 转换方法

    2022-01-03 01:18:53
  • python中文乱码的解决方法

    2022-07-12 18:03:48
  • Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容

    2023-04-01 15:20:05
  • 一文详述 Python 中的 property 语法

    2023-04-03 03:38:01
  • Python的进制转换和ASCLL转换你了解吗

    2021-09-18 05:33:59
  • mysql proxy问题

    2009-02-27 15:54:00
  • Python区块链创建Genesis Block教程

    2022-04-17 10:44:15
  • Python 面向对象之封装、继承、多态操作实例分析

    2021-04-09 10:03:54
  • Python超详细讲解内存管理机制

    2022-02-21 23:11:47
  • 使用python批量修改XML文件中图像的depth值

    2023-03-05 12:59:06
  • python打印日志方法的使用教程(logging模块)

    2023-12-10 01:39:14
  • python遍历文件夹下所有excel文件

    2023-10-26 17:57:12
  • 使用Gitee自动化部署python脚本的详细过程

    2022-03-30 07:04:55
  • 使用Cython中prange函数实现for循环的并行

    2023-04-13 05:31:55
  • Python深度学习pytorch神经网络多层感知机简洁实现

    2021-08-20 17:37:43
  • PyCharm 2020.2下配置Anaconda环境的方法步骤

    2022-10-08 14:25:00
  • pandas loc iloc ix用法详细分析

    2021-08-31 20:16:53
  • ASP.NET中使用SQL存储过程的方法

    2007-08-24 09:31:00
  • 浅谈keras的深度模型训练过程及结果记录方式

    2023-08-11 03:17:46
  • asp之家 网络编程 m.aspxhome.com