python的内存驻留机制(小数据池)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python的内存驻留机制(小数据池)相关的知识,希望对你有一定的参考价值。

参考技术A python的内存驻留机制,是一种节省内存的方案,它将int, str, bool类型的数据做成小数据池。当程序要创建字符串等对象前会先检查池中是否有满足的字符串。

驻留机制节省大量的重复内存。在内部,小数据池是由一个全局的dict 维护,该字典中的对象成了单例模式,从而节省内存。

变量 interned 就是全局存放字符串池的字典的变量名 interned = PyDict_New() ,为了让 intern 机制中的字符串不被回收,设置字典时 PyDict_SetDefault(interned, s, s); 将字符串作为键同时也作为值进行设置,这样对于字符串对象的引用计数就会进行两次 +1 操作,这样存于字典中的对象在程序结束前永远不会为 0,这也是 y_REFCNT(s) -= 2; 将计数减 2 的原因。

从函数参数中可以看到其实字符串对象还是被创建了,内部其实始终会为字符串创建对象,但经过 inter 机制检查后,临时创建的字符串会因引用计数为 0 而被销毁,临时变量在内存中昙花一现然后迅速消失。

指定要驻留的字符串:

为什么要进行字符串驻留呢?

总结:

系统维护一个interned全局字典,记录已被驻留的字符串对象,当新字符串a对象需要驻留时,先在interned中查找是否存在,若存在则指向已存在的字符串对象,a对象的引用计数减1,若不存在,则记录a对象到interned中。

Python 中的驻留机制:小数据池和代码块

Python 中的驻留机制:小数据池和代码块

Python 中的驻留机制主要有两个:小数据池和代码块。驻留机制并不是学习 Python 过程中特别重要的概念,我们学习小数据池的目的主要有两个方面:

  1. 解决日后写代码过程中可能出现的疑惑。在后期开发中,能 明确 知道有些代码为什么不能正常使用
  2. 找工作面试时或多或少可能被问到,关键时刻起到装 X 的作用

先补充一个关键字 isis(是)==(等于) 的作用十分相似,我们在这里将它们进行一个对比:

== :
    官方:判断等号两边的内容是否相同
    白话:判断两个人的长相是不是一样
is :
    官方:判断两边的内容是不是同一个
    白话:判断这两个人是不是同一个人

is 是通过 内存地址 进行判断,如果 内存地址 相同,返回 True;内存地址不同,返回 False

有了上面的补充,我们来看下面的这个例子:

a = 1000
b = 1000
print(a == b)
print(id(a), id(b))
print(a is b)   # 判断a是不是b

在PyCharm中的运行结果是:
True
2565251570544 2565251570544
True
在终端中的运行结果是:
True
1407133449136 1407133448880
False

在 PyCharm 中运行时我们发现,虽然 a 和 b 分别赋值 1000,它们在内存中的地址居然是相同的。而在终端中运行同样的代码,却又得到了 a 与 b 不相同的结果。

这是 Python 中的驻留机制造成的影响。Python 中,为了节省内存,会将一些小的数据驻留,当再次有变量获得相同的赋值时,不会开辟新的内存空间,而是指向原有的值所处的内存空间。

在 PyCharm 中运行的是一个 py 文件,是一个代码块。在代码块中,只要是大于 -5 的数字都共用同一个内存地址。而在终端中每一行分别为一个代码块,两个赋值操作共用一个小数据池。在小数据池中,只有在 -5 ~ 256 范围的数字才会被驻留。

小数据池和代码块的缓存机制是这样的:

终端中测试的是小数据池的缓存机制:
    数字:-5 ~ 256
    字符串:
    定义时内容不能为中文和特殊符号,长度不限,只要内容相同,就会进行驻留
    Python 3.6解释器字符串进行乘法时,也不能有中文字符和特殊符号,总长度不能超过20
    Python 3.7解释器字符串进行乘法时,不能有中文字符和特殊符号,总长度不能超过4096

PyCharm中测试的是代码块的缓存机制:
    数字:-5 ~ 正无穷
    字符串:
    定义内容、长度均不限,只要内容相同,就会驻留
    字符串进行乘法时,不能有中文字符和特殊符号,总长度不能超过20

对于字符串总长度的驻留情况,可以这样检验:

a = 'alex' * 6
b = 'alex' * 6
print(a is b)

以上是关于python的内存驻留机制(小数据池)的主要内容,如果未能解决你的问题,请参考以下文章

Python基础

小数据池 集合 深浅拷贝

python入门小数据池深浅拷贝集合

python入门小数据池深浅拷贝集合

Python 中的驻留机制:小数据池和代码块

Python入门-2编程基本概念:18字符串-驻留机制-内存分析-字符串同一判断-值相等判断