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安装Imaging报错:The _imaging C module is not installed问题解决方法
Aug 22 Python
Python函数式编程指南(三):迭代器详解
Jun 24 Python
python使用mysql数据库示例代码
May 21 Python
Python实现JSON反序列化类对象的示例
Jan 31 Python
使用Python进行AES加密和解密的示例代码
Feb 02 Python
python 多线程中子线程和主线程相互通信方法
Nov 09 Python
对pycharm 修改程序运行所需内存详解
Dec 03 Python
Python实现的调用C语言函数功能简单实例
Mar 13 Python
Pytorch 实现focal_loss 多类别和二分类示例
Jan 14 Python
pytorch 模型的train模式与eval模式实例
Feb 20 Python
Django中的模型类设计及展示示例详解
May 29 Python
Python的scikit-image模块实例讲解
Dec 30 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
windows xp下安装pear
2006/12/02 PHP
php的一些小问题
2010/07/03 PHP
php设计模式 Bridge (桥接模式)
2011/06/26 PHP
Notice: Trying to get property of non-object problem(PHP)解决办法
2012/03/11 PHP
19个Android常用工具类汇总
2014/12/30 PHP
php foreach如何跳出两层循环(详解)
2016/11/05 PHP
HTML5如何适配 iPhone IOS 底部黑条
2021/03/09 HTML / CSS
读取input:file的路径并显示本地图片的方法
2013/09/23 Javascript
jquery实现可点击伸缩与展开的菜单效果代码
2015/08/31 Javascript
jquery彩色投票进度条简单实例演示
2020/07/23 Javascript
JavaScript如何实现对数字保留两位小数一位自动补零
2015/12/18 Javascript
jQuery实现带遮罩层效果的blockUI弹出层示例【附demo源码下载】
2016/09/14 Javascript
JavaScript字符串检索字符的方法
2017/06/23 Javascript
浅谈小程序 setData学问多
2019/02/20 Javascript
vue + elementUI实现省市县三级联动的方法示例
2019/10/29 Javascript
JavaScript定时器常见用法实例分析
2019/11/15 Javascript
[00:34]TI7不朽珍藏III——纯金地穴编织者饰品展示
2017/07/15 DOTA
python之模拟鼠标键盘动作具体实现
2013/12/30 Python
python实现矩阵乘法的方法
2015/06/28 Python
python结合shell查询google关键词排名的实现代码
2016/02/27 Python
Python计算两个日期相差天数的方法示例
2017/05/23 Python
Python实现按学生年龄排序的实际问题详解
2017/08/29 Python
对python数据切割归并算法的实例讲解
2018/12/12 Python
基于Python实现全自动下载抖音视频
2020/11/06 Python
canvas实现飞机打怪兽射击小游戏的示例代码
2018/07/09 HTML / CSS
Canvas与Image互相转换示例代码
2013/08/09 HTML / CSS
html5 canvas绘制矩形和圆形的实例代码
2016/06/16 HTML / CSS
使用SVG实现提示框功能的示例代码
2020/06/05 HTML / CSS
印尼网上商店:Alfacart.com
2019/03/11 全球购物
小学后勤管理制度
2014/01/14 职场文书
中式婚礼主持词
2014/03/13 职场文书
抗洪救灾先进集体事迹材料
2014/05/26 职场文书
五一口号
2014/06/19 职场文书
项目安全员岗位职责
2015/02/15 职场文书
Mysql排序的特性详情
2021/11/01 MySQL
Python学习之包与模块详解
2022/03/19 Python