42.Python进阶_内存管理02_整数池和intern机制

本文详细介绍了Python的整数池机制,包括小整数对象池和大整数池,阐述了它们如何优化内存使用。此外,还讲解了intern机制,这是一种共享不可变对象的方式,以减少内存消耗。文章通过代码示例展示了不同整数和字符串在内存中的处理方式,并指出特殊字符不会被放入大整数池。
摘要由CSDN通过智能技术生成

说到数据存储,我们先来看一下整数池:

  1. 池子可以理解为 里面已经有存储的容器,你直接拿来用就行了, 如果池子没有东西 ,你就添加, 下次要用直接用,不要再次创建了。
  2. 这个池子 只是存储这一类的,其他不要你进来,达到了数据隔离。

1.小整数对象池

看一个代码:

In [1]: a=10

In [2]: b=10

In [3]: a is b
Out[3]: True

由上面可知,创建的对象都是相同的地址;
由于整数应该会频繁用到,python为了优化速度,使用了小整数池,避免为整数频繁申请和销毁内存空间;
小整数定义范围:[-5,257],这些整数是提前建立好的,不会被垃圾回收,Python中,所有位于这个范围内的整数使用的相同对象;
同理:单个字母也是一样的,
但是定义字符串,引用计数为0

2.大整数池

大整数池 和小整数池的区别是
  • 大整数池是没有提前创建好,是个空池子, 需要你自己创建 ,当你创建好了 会把整数对象保存到池子里。 后边再用就不需要创建,直接就可以用。

再看一个代码

In [1]: a=1000

In [2]: b=1000

In [3]: a is b
Out[3]: False

有没有发现同样都是数字,为何会和10的情况不一样,原来整数的存储当数字处于大整数池时,会单独创建内存空间;

每一个大整数,均会创建一个新的对象
但是在pycharm中,每次运行所有代码都加载到内存中,属于一个整体,所以也会有大整数池,即处于一个代码块的大整数是同一个对象,所以在pycharm下判断的结果和终端会不一样。,应该 以终端为准。

3.intern机制(共享机制)

intern 机制 和大整数池 也是一样的 都是保存好对象再 取用。
但是 intern 不是常驻内存,当没有地方引用的是会被回收的。 大整数池 不会被回收。

intern机制保存的是 不可变的类型, 如果是字符串要求是只能是 字母,下划线,数字,其他的特殊字符如空格,感叹号 ,则不适用。

好处是 : 如果一个字符需要创建100个, 难道在内存需要创建100 个吗, 这样得多占内存 。 所以让你们都共享一份就行。

一般来说,新对象建立都会直接开辟一个新的内存使用,但这样的就很容易占用资源,造成内存的浪费,所以python中建立了池化(intern)的概念,即对值相同的字符串对象只会保存一份,相当于共用一个字符串池,当需要值相同的字符串的时候(比如标识符),直接从池里拿来用,避免频繁的创建和销毁,提升效率,节约内存。

但是并不是所有的字符串都会采用intern机制。只包含下划线、数字、字母的字符串才会被intern

a = 'python'
b = 'python'
c = a
print(id(a))
print(id(b))
print(id(b))

运行结果:

  7691840
    7691840
    7691840

有特殊字符的字符串,也不会扔进大整数池,也单独创建内存空间;
例如特殊符号,空格等;

In [1]: a='hello@@python'

In [2]: b='hello@@python'

In [3]: c = a

In [4]: id(a)
Out[4]: 1671087296624

In [5]: id(b)
Out[5]: 1671087450992

In [6]: id(c)
Out[6]: 1671087296624

但是数字,字母,下划线会在大整数池;

In [1]: a='python_11'

In [2]: b='python_11'

In [3]: a is b
Out[3]: True

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值