小整数对象池
整数在程序中的使用非常广泛,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=256In [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机制
Falseintern机制处理空格一个单词的复用机会大,所以创建一次,有空格创建多次,但是字符串长度大于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" * 20s2 = "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
大整数对象池
说明:终端是每次执行一次,所以每次的大整数都重新创建,而在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
字符串intern机制与字符缓冲池
在编译过程中,字符串intern机制将所有的变量名进行intern,但对常量进行的intern有一点特殊的限制。能够intern的常量必须只包含[a-zA-Z0-9_],即字母数字加下划线,如果含有其他字符,就不会intern。在运行过程中,通过计算得到的字符串不会intern。
字符串有一个和小整数对象池相似的字符缓冲池,用于在运行过程中缓存单个字符,所以计算得到的字符串虽然不会intern,但如果是单个字符,就会使用到字符缓冲池。
总结
1. python代码被编译成code对象,通常一个code对象对应于一个作用域,作用域中重复出现的变量名以及常量在code中只保存一次。
2. 字符串intern机制主要作用于编译过程,在编译收集完变量和常量时,对变量和常量进行intern,而后构建一个code对象。
3. 字符串intern对常量的intern有限制,能够intern的常量必须只包含[a-zA-Z0-9_],即字母数字加下划线,如果含有其他字符,就不会intern。
4. 小整数对象池和字符缓冲池都是作用于运行过程中,python缓存小的整数和字符,当有变量使用这些对象时,不用额外创建对象。
材料来源原文:
https://www.cnblogs.com/luoheng23/p/11023848.html
https://blog.csdn.net/wangyunfeis/article/details/77607156