python字符串Intern机制详解


Posted in Python onJuly 01, 2019

字符串在 Python 中是最简单也是最常用的数据类型之一,在 CPython 中字符串的实现原理使用了一种叫做 Intern(字符串驻留)的技术来提高字符串效率。究竟什么是 intern 机制,这种机制又是通过什么方式来提高字符串效率的呢?希望这篇文章能够抛砖引玉。

先来看一段代码:

>>> s3 = "hello!"
>>> s4 = "hello!"
>>> s3 is s4
False
>>> id(s3)
80325968L
>>> id(s4)
80326048L

s3 和 s4 虽然值是一样的,但确确实实是两个不同的字符串对象,Python 会为它们俩各自分配一段内存空间,假设程序中存在大量值相同的字符串,系统就不得不为每个字符串重复地分配内存空间,显然,对系统来说是一种无谓的资源浪费。为了解决这种问题,Python 引入了 intern 机制。

python字符串Intern机制详解

再来看:

>>> s3 = intern('hello!')
>>> s4 = intern('hello!')
>>> s3 is s4
True
>>> id(s3)
80325968L
>>> id(s4)
80325968L

intern 是 Python 中的一个内建函数,该函数的作用就是对字符串进行 intern 机制处理,处理后返回字符串对象。我们发现但凡是值相同的字符串经过 intern 机制处理之后,返回的都是同一个字符串对象,这种方式在处理大数据的时候无疑能节省更多的内存空间,系统无需为相同的字符串重复分配内存,对于值相同的字符串共用一个对象即可。

python字符串Intern机制详解

其实,实现 Intern 机制的方式非常简单,就是通过维护一个字符串储蓄池,这个池子是一个字典结构,如果字符串已经存在于池子中了就不再去创建新的字符串,直接返回之前创建好的字符串对象,如果之前还没有加入到该池子中,则先构造一个字符串对象,并把这个对象加入到池子中去,方便下一次获取,用伪代码就可以描述为:

intern_pool = {}
def intern(s):
if s in intern_pool:
return intern_pool[s]
else:
obj = PyStringObject(s)
intern_pool[s] = obj
return obj

在主流面向对象的编程语言中intern 机制对于处理字符串已经成为一种标配,通过 intern 机制可以提高字符串的处理效率,当然,解释器内部很对 intern 机制的使用策略是有考究的,有些场景会自动使用 intern ,有些地方需要通过手动方式才能启动。比如:

>>> s1 = "hello"
>>> s2 = "hello"
>>> s1 is s2
True
>>> id(s1)
72320704L
>>> id(s2)
72320704L

这段代码就是 Python自动使用了intern机制的结果。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python获取指定目录下所有文件名列表的方法
May 20 Python
python+selenium实现登录账户后自动点击的示例
Dec 22 Python
Python读取excel中的图片完美解决方法
Jul 27 Python
对python中数据集划分函数StratifiedShuffleSplit的使用详解
Dec 11 Python
Python实现Restful API的例子
Aug 31 Python
Python编程快速上手——PDF文件操作案例分析
Feb 28 Python
Python3.7下安装pyqt5的方法步骤(图文)
May 12 Python
python退出循环的方法
Jun 18 Python
基于python实现删除指定文件类型
Jul 21 Python
python 实现倒计时功能(gui界面)
Nov 11 Python
python基于tkinter制作无损音乐下载工具
Mar 29 Python
用python开发一款操作MySQL的小工具
May 12 Python
简单了解python单例模式的几种写法
Jul 01 #Python
python如何获取列表中每个元素的下标位置
Jul 01 #Python
Django自定义用户登录认证示例代码
Jun 30 #Python
Python中栈、队列与优先级队列的实现方法
Jun 30 #Python
Python中请不要再用re.compile了
Jun 30 #Python
用python求一个数组的和与平均值的实现方法
Jun 29 #Python
Python:Numpy 求平均向量的实例
Jun 29 #Python
You might like
在服务端进行目录建立、删除,文件上传、删除的过程的php代码
2008/09/10 PHP
PHP删除特定数组内容并且重建数组索引的方法.
2011/03/25 PHP
php中数组首字符过滤功能代码
2012/07/31 PHP
thinkphp自定义权限管理之名称判断方法
2017/04/01 PHP
PHP封装类似thinkphp连贯操作数据库Db类与简单应用示例
2019/05/08 PHP
PHP扩展安装方法步骤解析
2020/11/24 PHP
javascript 验证日期的函数
2010/03/18 Javascript
js 回车提交表单两种实现方法
2012/12/31 Javascript
jQuery使用fadeout实现元素渐隐效果的方法
2015/03/27 Javascript
yui3的AOP(面向切面编程)和OOP(面向对象编程)
2015/05/01 Javascript
nodejs简单实现中英文翻译
2015/05/04 NodeJs
jQuery使用EasyUi实现三级联动下拉框效果
2017/03/08 Javascript
对angular 监控数据模型变化的事件方法$watch详解
2018/10/09 Javascript
NodeJS实现同步的方法
2019/03/02 NodeJs
使用nodejs分离html文件里的js和css详解
2019/04/12 NodeJs
python基础教程之数字处理(math)模块详解
2014/03/25 Python
python基于mysql实现的简单队列以及跨进程锁实例详解
2014/07/07 Python
在Python中使用PIL模块对图片进行高斯模糊处理的教程
2015/05/05 Python
Django中模型Model添加JSON类型字段的方法
2015/06/17 Python
Python 使用os.remove删除文件夹时报错的解决方法
2017/01/13 Python
python 设置文件编码格式的实现方法
2017/12/21 Python
Django框架的使用教程路由请求响应的方法
2018/07/03 Python
Flask框架Flask-Login用法分析
2018/07/23 Python
python中如何使用分步式进程计算详解
2019/03/22 Python
Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)
2019/05/13 Python
Anaconda3中的Jupyter notebook添加目录插件的实现
2020/05/18 Python
护理专业推荐信
2013/11/07 职场文书
大学四年个人自我小结
2014/03/05 职场文书
调查研究项目计划书
2014/04/29 职场文书
大学生简短的自我评价
2014/09/12 职场文书
体育个人工作总结
2015/02/09 职场文书
辞职信如何写
2015/02/27 职场文书
2015年“我们的节日·重阳节”活动总结
2015/07/29 职场文书
事业单位岗位说明书
2015/10/08 职场文书
浅谈Golang 切片(slice)扩容机制的原理
2021/06/09 Golang
jdbc中自带MySQL 连接池实践示例
2022/07/23 MySQL