之前我还在考虑,这个垃圾回收有没有必要写, 但是想想在性能测试的时候,经常遇到垃圾回收的东西,内存泄漏什么的,
如果你不懂垃圾回收,可能后边做性能测试就有点难了, 在开发的时候你不懂也没有关系,不影响你写代码,
小数整数池
为什么 称为池子呢, 池子在python 经常会遇到, 以后我们也会说进程池,线程池。
-
池子可以理解为 里面已经有存储的东西,你直接拿来用就行了, 如果池子没有东西 ,你就添加, 下次要用直接用,不要再次创建了。
-
这个池子 只是存储这一类的,其他不要你进来,达到了数据隔离。
咱们看下这边的代码
print(id(100)) # 直接取 100 的地址
a=100 # 创建一个 对象 a
b=100 # 创建一个对象b
print(id(a)) # 打印a 的地址
print(id(b)) # 打印b的地址
通过以上的代码 可以了解到, 100 无论你如何创建 都是 同一个地址,
所以 小数整数池 的意思 系统已经为你准备好了 【-5,257)范围内 所有整数, 不需要直接创建 ,拿来直接用,
有的小伙伴该说了,为什么要这么做?
答: python 通过大数据统计,在开发的过程中 , 这些数据范围用的最多, 如果没有这些会导致,系统频繁的创建,回收。这样系统资源消耗很大。 所以给这些 开个特例。
大整数池
大整数池 和小整数池的区别是
- 大整数池是没有提前创建好,是个空池子, 需要你自己创建 ,当你创建好了 会把整数对象保存到池子里。 后边再用就不需要创建,直接就可以用。
验证代码如下:
a=100000
b=100000
print(id(a))
print(id(b))
print(a is b)
打印结果:
2082067169008
2082067169008
True
intern 机制(共享机制)
intern 机制 和大整数池 也是一样的 都是保存好对象再 取用。
但是 intern 不是常驻内存,当没有地方引用的是会被回收的。 大整数池 不会被回收。
intern机制保存的是 不可变的类型, 如果是字符串要求是只能是 字母,下划线,数字,其他的特殊字符如空格,感叹号 ,则不适用。
好处是 : 如果一个字符需要创建100个, 难道在内存需要创建100 个吗, 这样得多占内存 。 所以让你们都共享一份就行。
>>> a="abc"
>>> b="abc"
>>> a is b
True
>>> a="a_b"
>>> b="a_b"
>>> a is b
True
>>> a="a b"
>>> b="a b"
>>> a is b
False
>>>