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函数中*args和**kwargs来传递变长参数的用法
Jan 26 Python
Python多线程爬虫简单示例
Mar 04 Python
详解Python 解压缩文件
Apr 09 Python
11个Python3字典内置方法大全与示例汇总
May 13 Python
基于python的selenium两种文件上传操作实现详解
Sep 19 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
May 15 Python
PyQt5实现简单的计算器
May 30 Python
python实现简单的五子棋游戏
Sep 01 Python
python类共享变量操作
Sep 03 Python
详解Python中string模块除去Str还剩下什么
Nov 30 Python
matplotlib相关系统目录获取方式小结
Feb 03 Python
一行代码python实现文件共享服务器
Apr 22 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/20 PHP
php长字符串定义方法
2012/07/12 PHP
php连接函数implode与分割explode的深入解析
2013/06/26 PHP
PHP fopen()和 file_get_contents()应用与差异介绍
2014/03/19 PHP
PHP模板引擎Smarty内置变量调解器用法详解
2016/04/11 PHP
深入理解PHP中的empty和isset函数
2016/05/26 PHP
showModelessDialog()使用详解
2006/09/21 Javascript
在JS中最常看到切最容易迷惑的语法(转)
2010/10/29 Javascript
jQuery 名称冲突的解决方法
2011/04/08 Javascript
angularJS 中input示例分享
2015/02/09 Javascript
javascript bom是什么及bom和dom的区别
2015/11/26 Javascript
dedecms页面如何获取会员状态的实例代码
2016/03/15 Javascript
JS控制HTML元素的显示和隐藏的两种方法
2016/09/27 Javascript
yarn与npm的命令行小结
2016/10/20 Javascript
js倒计时小实例(多次定时)
2016/12/08 Javascript
动态创建Angular组件实现popup弹窗功能
2017/09/15 Javascript
微信小程序之页面跳转和参数传递的实现
2017/09/29 Javascript
微信小程序实现折叠与展开文章功能
2018/06/12 Javascript
JS+HTML5实现获取手机验证码倒计时按钮
2018/08/08 Javascript
详解基于 Node.js 的轻量级云函数功能实现
2019/07/08 Javascript
jQuery实现的上拉刷新功能组件示例
2020/05/01 jQuery
通过实例了解JS执行上下文运行原理
2020/06/17 Javascript
Python 正则表达式的高级用法
2016/12/04 Python
Python配置mysql的教程(推荐)
2017/10/13 Python
基于python plotly交互式图表大全
2019/12/07 Python
Python urllib.request对象案例解析
2020/05/11 Python
解决Keras TensorFlow 混编中 trainable=False设置无效问题
2020/06/28 Python
Keras中 ImageDataGenerator函数的参数用法
2020/07/03 Python
Python使用paramiko连接远程服务器执行Shell命令的实现
2021/03/04 Python
html5 制作地图当前定位箭头的方法示例
2020/01/10 HTML / CSS
澳大利亚家用电器在线商店:Billy Guyatts
2020/05/05 全球购物
final, finally, finalize的区别
2012/03/01 面试题
音乐系毕业生自荐信
2013/10/27 职场文书
成语的广告词
2014/03/19 职场文书
Vue.js中v-bind指令的用法介绍
2022/03/13 Vue.js
国产动画《万圣街》日语配音版制作决定!
2022/03/20 国漫