美文网首页
python的内存驻留机制(小数据池)

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

作者: 飞跑的蛤蟆 | 来源:发表于2020-05-11 22:50 被阅读0次

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

  • 字符串不超过20个字符且仅包含大小写字母、数字、下划线
  • 数字在[-5, 256]之间

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

void PyUnicode_InternInPlace(PyObject **p)
{
    PyObject *s = *p;
    PyObject *t;

    if (s == NULL || !PyUnicode_Check(s))
        return;

    // 对PyUnicodeObjec进行类型和状态检查
    if (!PyUnicode_CheckExact(s))
        return;
    if (PyUnicode_CHECK_INTERNED(s))
        return;
    // 创建intern机制的dict
    if (interned == NULL) {
        interned = PyDict_New();
        if (interned == NULL) {
            PyErr_Clear(); /* Don't leave an exception */
            return;
        }
    }

    // 对象是否存在于inter中
    t = PyDict_SetDefault(interned, s, s);

    // 存在, 调整引用计数
    if (t != s) {
        Py_INCREF(t);
        Py_SETREF(*p, t);
        return;
    }
    /* The two references in interned are not counted by refcnt.
       The deallocator will take care of this */
    Py_REFCNT(s) -= 2;
    _PyUnicode_STATE(s).interned = SSTATE_INTERNED_MORTAL;
}

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

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

指定要驻留的字符串:

In [74]: a = "hello!@"

In [75]: b = "hello!@"

In [76]: id(a)
Out[76]: 1491977744144

In [77]: id(b)
Out[77]: 1491973470616

In [78]: from sys import intern  # 使用上面所说的intern机制进行驻留

In [79]: a = intern("hello!@")

In [80]: b = intern("hello!@")

In [81]: id(a)
Out[81]: 1491978046072

In [82]: id(b)
Out[82]: 1491978046072

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

  1. 显而易见,节省大量内存
  2. 在字符串进行比较时,非驻留比较效率O(n),驻留时比较效率O(1)。
image.png

总结:

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

参考资料:

python:超详细的字符串驻留

相关文章

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

    python的内存驻留机制,是一种节省内存的方案,它将int, str, bool类型的数据做成小数据池。当程序要...

  • python内存管理机制

    Python内存管理机制 Python内存管理机制主要包括以下三个方面: 引用计数机制 垃圾回收机制 内存池机制 ...

  • python学习一

    1 python 如何管理内存 对象引用计数机制,垃圾回收机制,内存池机制 一。对象引用机制 python内部引用...

  • Python内存管理机制

    Python内存管理机制主要包括以下三个方面:引用计数机制 垃圾回收机制 内存池机制

  • Python Memory Management

    Python的内存管理机制可以从三个方面来讲: 引用计数 垃圾回收 内存池机制 引用计数 Python采用了类似W...

  • python内存管理机制

    Python内存管理机制主要包括以下三个方面: 引用计数机制 垃圾回收机制 内存池机制 引用计数 举个例子说明引用...

  • Python(三)

    字符串 创建和驻留机制 在python中字符串是基本数据类型,是一个不可变的字符序列 什么叫字符串驻留机制:仅保存...

  • python的内存管理机制

    先从较浅的层面来说,Python的内存管理机制可以从三个方面来讲 (1)垃圾回收 (2)引用计数 (3)内存池机制...

  • python面试题(一)

    Python是如何进行内存管理的? 从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制 Pytho...

  • 给大家分享一道来自BAT的Python面试题

    Python是如何进行内存管理的? 答:从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制。 1、...

网友评论

      本文标题:python的内存驻留机制(小数据池)

      本文链接:https://www.haomeiwen.com/subject/qnqmnhtx.html