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处理文本文件并生成指定格式的文件
Jul 31 Python
用python删除java文件头上版权信息的方法
Jul 31 Python
玩转python爬虫之cookie使用方法
Feb 17 Python
python 数据的清理行为实例详解
Jul 12 Python
在python下读取并展示raw格式的图片实例
Jan 24 Python
python爬取cnvd漏洞库信息的实例
Feb 14 Python
实例讲解Python3中abs()函数
Feb 19 Python
用Cython加速Python到“起飞”(推荐)
Aug 01 Python
8段用于数据清洗Python代码(小结)
Oct 31 Python
Python pexpect模块及shell脚本except原理解析
Aug 03 Python
Python生成并下载文件后端代码实例
Aug 31 Python
对Keras自带Loss Function的深入研究
May 25 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
我常用的几个类
2006/10/09 PHP
PHP学习笔记 用户注册模块用户类以及验证码类
2011/09/20 PHP
php操作XML、读取数据和写入数据的实现代码
2014/08/15 PHP
PHP按指定键值对二维数组进行排序的方法
2015/12/22 PHP
smarty高级特性之过滤器的使用方法
2015/12/25 PHP
Colortip基于jquery的信息提示框插件在IE6下面的显示问题修正方法
2010/12/06 Javascript
基于jquery的合并table相同单元格的插件(精简版)
2011/04/05 Javascript
放弃用你的InnerHTML来输出HTML吧 jQuery Tmpl不详细讲解
2013/04/20 Javascript
window.location不跳转的问题解决方法
2014/04/17 Javascript
js调试工具console.log()方法查看js代码的执行情况
2014/08/08 Javascript
jquery手风琴特效插件
2015/02/04 Javascript
js控制页面的全屏展示和退出全屏显示的方法
2015/03/10 Javascript
Bootstrap table 定制提示语的加载过程
2017/02/20 Javascript
学习JS中的DOM节点以及操作
2018/04/30 Javascript
深入浅析Vue全局组件与局部组件的区别
2018/06/15 Javascript
如何使用vue slot创建一个模态框的实例代码
2020/05/24 Javascript
详谈Vue.js框架下main.js,App.vue,page/index.vue之间的区别
2020/08/12 Javascript
JavaScript实现弹出窗口效果
2020/12/09 Javascript
讲解Python中fileno()方法的使用
2015/05/24 Python
python实现的多线程端口扫描功能示例
2017/01/21 Python
python 除法保留两位小数点的方法
2018/07/16 Python
python 根据时间来生成唯一的字符串方法
2019/01/14 Python
linux中如何使用python3获取ip地址
2019/07/15 Python
Python3.7实现验证码登录方式代码实例
2020/02/14 Python
关于python scrapy中添加cookie踩坑记录
2020/11/17 Python
Qoo10马来西亚:全球时尚和引领潮流的购物市场
2016/08/25 全球购物
JD Sports德国官网:英国领先的运动鞋和运动服饰零售商
2018/02/26 全球购物
编辑找工作求职信分享
2014/01/03 职场文书
2014国庆节标语口号
2014/09/19 职场文书
2014年图书馆工作总结
2014/11/25 职场文书
汇报材料怎么写
2014/12/30 职场文书
2019年怎样写好导游词?
2019/07/02 职场文书
CocosCreator ScrollView优化系列之分帧加载
2021/04/14 Python
CSS预处理框架——Stylus
2021/04/21 HTML / CSS
pandas取dataframe特定行列的实现方法
2021/05/24 Python
使用Python拟合函数曲线
2022/04/14 Python