zoukankan      html  css  js  c++  java
  • python内存优化机制中的小秘密

    首先我们先来看一个这样的问题:

    1 a = -5
    2 b = -5
    3 print(a is b)
    4 
    5 c = -6
    6 d = -6
    7 print(c is d)
    8 
    9 # 输出结果是?

    大多数没踩过这个坑的小伙伴的答案要么都是True,要么都是False。

    但是,,,其真正的结果并不是如此。。。

    是不是感觉一脸懵逼???

    正确答案是:True 和 False

    是不是会在心里说what???  这不合乎逻辑啊。。。

    但是事实就是这样。

    这是由于python的内存优化机制造成的,Python在存储一些数字的时候,对内存做了相应的优化,导致了两个变量被赋值为同样小于-5的数字时,内存地址不一样,而对于大于-5的数字,其内存地址却是一样的。(python认为范围在[-5,256]的整数的使用对于用户来说,会在程序中像这样给变量赋值的次数较多,处于节省内存的考虑,将值在[-5,256]的整数的变量都指向了同一的内存地址,达到节省内存的目的)

     *  但是这也和编辑器有关(我在IDLE中测试的范围为[-5,256]的整数,而在pycharm上测试的范围为大于-5的整数。

    《python源码剖析》中的解释:

      对于小整数对象,可能在程序中会经常的使用。在python中,所有的对象都存活在系统堆上,如果将这些经常使用的小整数对象也放在系统堆上,python就会经常的在堆上申请空间,释放空间,会严重的影响python的整体性能。

      于是,对于小整数对象做了一些改变(优化),python中,对于小整数对象使用了对象池技术,将小整数对象对应的PyIntObject(不可变对象,在对象池中,每一个PyIntobject对象都能被任意的共享)缓存在内存中,并将其指针放在small_ints(小整数对象的对象池)中。

  • 相关阅读:
    img 的data-src 属性及懒加载
    try catch 用法
    input 的各种属性的验证 checkValidity兼容性
    表单提交的方法。
    通信原理
    计算机组成原理
    CREC 2017
    POJ 1201 Intervals
    HDU 3440 House Man
    poj 3169 Layout
  • 原文地址:https://www.cnblogs.com/aberwang/p/10403549.html
Copyright © 2011-2022 走看看