• python小数据池,代码块深入剖析


    小数据池

    目的:缓存我们字符串,整数,布尔值.在使用的时候不需要创建更多的对象

    缓存:int,str,bool

    int:缓存范围-5~256

    str:    1.长度小于等于1,直接缓存

             2.长度大于1.字符串中如果只有数字,字母,下划线,就会缓存

             3.乘于1.同上,乘于大于1的数.仅包含数字,字母,下划线,最终长度小于20会缓存

             4.使用sys模块中的intern()缓存字符串

    代码块的关系:如果在同一个代码块中,默认的整数和字符串还有布尔值都会进行缓存,如果涉及计算,尊崇上面的规则,

    如果跨代码块,按照上面的规则执行

    1. 小整数对象池

    整数在程序中的使用非常广泛,Python为了优化速度,使用了小整数对象池, 避免为整数频繁申请和销毁内存空间。

    Python 对小整数的定义是 [-5, 256] 这些整数对象是提前建立好的,不会被垃圾回收。在一个 Python 的程序中,

    无论这个整数处于LEGB中的哪个位置,

    所有位于这个范围内的整数使用的都是同一个对象。同理,单个字母也是这样的。

    In [1]: a=-5
    
    In [2]: b=-5
    
    In [3]: a is b
    Out[3]: True
    
    In [4]: a=256
    
    In [5]: b=256
    
    In [6]: a is b
    Out[6]: True
    
    In [7]: a=1000
    
    In [8]: b=1000
    
    In [9]: a is b
    Out[9]: False
    intern机制处理空格一个单词的复用机会大,所以创建一次,有空格创建多次,但是字符串长度大于20,就不是创建一次了。
    In [13]: a="abc"
    
    In [14]: b="abc"
    
    In [15]: a is b
    Out[15]: True
    
    In [16]: a="helloworld"
    
    In [17]: b="helloworld"
    
    In [18]: a is b
    Out[18]: True
    
    In [19]: a="hello world"
    
    In [20]: b="hello world"
    
    In [21]: a is b
    Out[21]: False
    s1 = "abcd"
    s2 = "abcd"
    print(s1 is s2)
    
    s1 = "a" * 20
    s2 = "a" * 20
    print(s1 is s2)
    
    s1 = "a" * 21
    s2 = "a" * 21
    print(s1 is s2)
    
    s1 = "ab" * 10
    s2 = "ab" * 10
    print(s1 is s2)
    
    s1 = "ab" * 11
    s2 = "ab" * 11
    print(s1 is s2)
    # True
    # True
    # False
    # True
    # False

    2.大整数对象池。说明:终端是每次执行一次,所以每次的大整数都重新创建,

    而在pycharm中,每次运行是所有代码都加载都内存中,属于一个整体,所以

     这个时候会有一个大整数对象池,即处于一个代码块的大整数是同一个对象。

    c1 和d1 处于一个代码块,而c1.b和c2.b分别有自己的代码块,所以不相等。

    C1.b is C2.b
    In [22]: a=1000
    
    In [23]: b=1000
    
    In [24]: a is b
    Out[24]: False
    
    In [25]: a=-1888
    
    In [26]: b=-1888
    
    In [27]: a is b
    Out[27]: False
    
    In [28]: 
    
    
    c1 = 1000
    d1 = 1000
    print(c1 is d1) # True

    class C1(object): a = 100 b = 100 c = 1000 d = 1000 class C2(object): a = 100 b = 1000 print(C1.a is C1.b) # True print(C1.a is C2.a) # True print(C1.c is C1.d) # True print(C1.b is C2.b) # False
  • 相关阅读:
    Linux rcp命令详解
    Linux patch命令详解
    Linux paste命令详解
    linux od命令详解
    linux mv命令详解
    Linux more命令详解
    Linux mktemp命令
    MySQL状态变量详解
    mysql性能分析show profile/show profiles
    MySQL执行计划
  • 原文地址:https://www.cnblogs.com/ellisonzhang/p/10390436.html
Copyright © 2020-2023  润新知