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 算法 排序实现快速排序
Jun 05 Python
Python reduce()函数的用法小结
Nov 15 Python
python实现对文件中图片生成带标签的txt文件方法
Apr 27 Python
TensorFlow实现卷积神经网络
May 24 Python
Python实现简单层次聚类算法以及可视化
Mar 18 Python
六行python代码的爱心曲线详解
May 17 Python
python-Web-flask-视图内容和模板知识点西宁街
Aug 23 Python
Python实现多线程/多进程的TCP服务器
Sep 03 Python
numpy实现神经网络反向传播算法的步骤
Dec 24 Python
TensorFlow保存TensorBoard图像操作
Jun 23 Python
pycharm配置QtDesigner的超详细方法
Jan 25 Python
解析目标检测之IoU
Jun 26 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
WML,Apache,和 PHP 的介绍
2006/10/09 PHP
windows下PHP APACHE MYSQ完整配置
2007/01/02 PHP
php 文本文件的读取效率
2012/02/10 PHP
基于php验证码函数的使用示例
2013/05/03 PHP
php计算多维数组中所有值总和的方法
2015/06/24 PHP
PHP-FPM 的管理和配置详解
2019/02/17 PHP
阿里对象存储OSS在laravel框架中的使用方法
2019/10/13 PHP
ExtJS 2.0 GridPanel基本表格简明教程
2010/05/25 Javascript
EasyUi tabs的高度与宽度根据IE窗口的变化自适应代码
2010/10/26 Javascript
xml转json的js代码
2012/08/28 Javascript
Jquery解析json数据详解
2013/12/26 Javascript
判断复选框是否被选中的两种方法
2014/06/04 Javascript
JavaScript随机打乱数组顺序之随机洗牌算法
2016/08/02 Javascript
webpack实现一个行内样式px转vw的loader示例
2018/09/13 Javascript
从Vuex中取出数组赋值给新的数组,新数组push时报错的解决方法
2018/09/18 Javascript
angular学习之动态创建表单的方法
2018/12/07 Javascript
使用apifm-wxapi快速开发小程序过程详解
2019/08/05 Javascript
解决jquery validate 验证不通过后验证正确的信息仍残留在label上的方法
2019/08/27 jQuery
在layui tab控件中载入外部html页面的方法
2019/09/04 Javascript
[01:52]2014DOTA2西雅图邀请赛 V社开大会你不知道的小秘密
2014/07/08 DOTA
Pandas读取并修改excel的示例代码
2019/02/17 Python
Django 实现前端图片压缩功能的方法
2019/08/07 Python
关于pycharm中pip版本10.0无法使用的解决办法
2019/10/10 Python
Keras: model实现固定部分layer,训练部分layer操作
2020/06/28 Python
python爬虫基础之urllib的使用
2020/12/31 Python
HTML5录音实践总结(Preact)
2020/05/07 HTML / CSS
巴西儿童时尚购物网站:Dinda
2019/08/14 全球购物
军训的自我鉴定
2013/12/10 职场文书
实习老师离校感言
2014/02/03 职场文书
行政文秘岗位职责范本
2014/02/10 职场文书
专业求职信撰写要诀
2014/02/18 职场文书
《九寨沟》教学反思
2014/04/08 职场文书
助人为乐模范事迹材料
2014/06/02 职场文书
工作业绩不及格检讨书
2014/10/28 职场文书
2015年教师工作总结范文
2015/03/31 职场文书