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

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

显而易见,节省大量内存

在字符串进行比较时,非驻留比较效率O(n),驻留时比较效率O(1)。

image.png

总结:

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

python字符串驻留机制_python的内存驻留机制(小数据池)相关推荐

  1. python is 和 == 的区别、解码和编码 小数据池

    一 .  is 和 == (1)  is 是比较两边的内存地址 a=1 print(id(a))b=1 print(id(b))print(a is b) # Truestr='alex' print ...

  2. 什么是python语言的动态类型机制_python的内存管理机制

    一.python是一个什么样类型的语言 1.python是一种动态解释性强类型定义的高级.通用性编程语言. 解释型:执行的时候,才一条一条的解释成机器语言给计算机来执行.如:python.js.rub ...

  3. python内存池机制_python的内存管理机制

    一.python是一个什么样类型的语言 1.python是一种动态解释性强类型定义的高级.通用性编程语言. 解释型:执行的时候,才一条一条的解释成机器语言给计算机来执行.如:python.js.rub ...

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

    Python 中的驻留机制主要有两个:小数据池和代码块.驻留机制并不是学习 Python 过程中特别重要的概念,我们学习小数据池的目的主要有两个方面: 1.解决日后写代码过程中可能出现的疑惑.在后期开 ...

  5. python使用什么来区分代码块_Python 小数据池、代码块以及代码块缓存机制

    按照惯例,吟诗一首:苏轼<江城子·乙卯正月二十日夜记梦> 十年生死两茫茫,不思量,自难忘.千里孤坟,无处话凄凉. 纵使相逢应不识,尘满面,鬓如霜. 夜来幽梦忽还乡,小轩窗,正梳妆.相顾无言 ...

  6. python我想对你说_python学习第4天----is和==区别、小数据池、编码解码

    1.is和==的区别 1)==比较的是左右两边的值,无论是字符串.数字.列表,元组.若两边的值相等,则返回True a = "zdz"b= "zdz" prin ...

  7. 21天学通python电子版-小数据池,深浅拷贝,集合+菜中菜

    小数据池,不同代码块的缓存机制,也称为小整数缓存机制,或者称为驻留机制等等,博主认为,只要你在网上查到的这些名字其实说的都是一个意思,叫什么因人而异. 那么到底什么是小数据池?他有什么作用呢? 前提条 ...

  8. 相识python 之小数据池 集合

    ⼀一. ⼩小数据池 在说⼩小数据池之前. 我们先看⼀一个概念念. 什什么是代码块: 根据提示我们从官⽅方⽂文档找到了了这样的说法: A Python program is constructed fr ...

  9. python的内存管理机制及调优手段_Python的内存管理机制及调优手段?

    转载自 http://kkpattern.github.io/2015/06/20/python-memory-optimization-zh.html 准备工作 为了方便解释Python的内存管理机 ...

最新文章

  1. 如何在Terminal命令行模式下运行Objective-C
  2. javaweb项目开发日志的原理,方式
  3. GitHub上如何进行PR(Pull Request)操作——简版
  4. html 多行多列列表格,HTML跨多行跨多列表格.doc
  5. VTP (vlan trunking protocol)
  6. 十天冲刺---Day8
  7. 使用绝对布局的方法创建一个登录密码验证的简易窗口
  8. 保密 | 利用DOS命令将文本信息隐藏在图片中
  9. 产能过剩时代,为什么说“送比卖更赚钱”
  10. ios 地图黑屏_ios – 导航控制器显示黑屏
  11. 旺旺上显示已上传服务器,在服务器上排除问题的头五分钟 | 旺旺知识库
  12. mysql安装updatecatalog_mysql安装与配置(linux)
  13. 大型网站技术架构 读书笔记 (二) 大型网站架构模式
  14. 【JavaScript】模块化规范
  15. android 监测usb有线网卡的网线连接状态 详细一点的输出信息解析
  16. 机器学习——统计学三大相关性系数(pearson、spearman、kendall)
  17. 【定时同步系列5】Farrow内插器结构原理和MATLAB实现
  18. 百练 / 2016计算机学科夏令营上机考试: E
  19. Excel将多个工作表一键按照字母排序
  20. 盘点最令人难忘的十大谍战剧经典

热门文章

  1. web前端基础知识-(六)jQuery-补
  2. 虚拟机安装centos7后无法联网
  3. Android PackageManagerService分析三:卸载APK
  4. Software Switching优化
  5. Java中跳出多层循环的简单方法
  6. DOS批处理全面教程
  7. Linux 命令(21)—— cd 命令(builtin)
  8. (int),Int32.Parse,Convert.ToInt3…
  9. 共享内存+互斥量实现 Linux 进程间通信
  10. 下面这些是什么意思:@classmethod, @staticmethod, @property?