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实现从字符串中找出字符1的位置以及个数的方法
Aug 25 Python
Python3实现并发检验代理池地址的方法
Sep 18 Python
python 将print输出的内容保存到txt文件中
Jul 17 Python
python 把列表转化为字符串的方法
Oct 23 Python
python实现flappy bird小游戏
Dec 24 Python
将string类型的数据类型转换为spark rdd时报错的解决方法
Feb 18 Python
python自动循环定时开关机(非重启)测试
Aug 26 Python
Python with标签使用方法解析
Jan 17 Python
在django中使用apscheduler 执行计划任务的实现方法
Feb 11 Python
python函数enumerate,operator和Counter使用技巧实例小结
Feb 22 Python
Python函数的迭代器与生成器的示例代码
Jun 18 Python
python的setattr函数实例用法
Dec 16 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对字符串的递增运算分析
2010/08/08 PHP
PHP数组操作类实例
2015/07/11 PHP
PHP内存缓存功能memcached示例
2016/10/19 PHP
PHP哈希表实现算法原理解析
2020/12/11 PHP
ExtJs中简单的登录界面制作方法
2010/08/19 Javascript
Chosen 基于jquery的选择框插件使用方法
2012/05/30 Javascript
往光标所在位置插入值的js代码
2013/09/22 Javascript
JQuery中使用ajax传输超大数据的解决方法
2014/07/14 Javascript
Javascript中arguments对象详解
2014/10/22 Javascript
简述AngularJS的控制器的使用
2015/06/16 Javascript
javascript实现平滑无缝滚动
2020/08/09 Javascript
浅谈javascript中执行环境(作用域)与作用域链
2016/12/08 Javascript
Jqprint实现页面打印
2017/01/06 Javascript
小程序测试后台服务的方法(ngrok)
2019/03/08 Javascript
分享一款超好用的JavaScript 打包压缩工具
2020/04/26 Javascript
[01:30:55]VG vs Mineski Supermajor 败者组 BO3 第三场 6.6
2018/06/07 DOTA
用Python编写生成树状结构的文件目录的脚本的教程
2015/05/04 Python
python编程实现归并排序
2017/04/14 Python
TensorFlow 模型载入方法汇总(小结)
2018/06/19 Python
详解用Python练习画个美队盾牌
2019/03/23 Python
matplotlib命令与格式之tick坐标轴日期格式(设置日期主副刻度)
2019/08/06 Python
Python 50行爬虫抓取并处理图灵书目过程详解
2019/09/20 Python
Python imread、newaxis用法详解
2019/11/04 Python
Python API自动化框架总结
2019/11/12 Python
python给list排序的简单方法
2020/12/10 Python
Python绘制数码晶体管日期
2021/02/19 Python
捷克母婴用品购物网站:Feedo.cz
2020/12/28 全球购物
Pharmacy Online中文直邮网站:澳洲大型药房
2020/06/27 全球购物
物流司机岗位职责
2013/12/28 职场文书
中医临床专业自我鉴定范文
2014/01/15 职场文书
大学生学年自我鉴定
2014/02/10 职场文书
俄语专业职业生涯规划
2014/02/26 职场文书
数学系毕业生求职信
2014/05/29 职场文书
公司自我介绍演讲稿
2014/08/21 职场文书
SpringBoot集成Redis,并自定义对象序列化操作
2021/06/22 Java/Android
JavaScript函数柯里化
2021/11/07 Javascript