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使用Flask框架同时上传多个文件的方法
Mar 21 Python
Python中的sort()方法使用基础教程
Jan 08 Python
浅谈Python对内存的使用(深浅拷贝)
Jan 17 Python
python爬虫_实现校园网自动重连脚本的教程
Apr 22 Python
Python 查看list中是否含有某元素的方法
Jun 27 Python
python opencv实现图片旋转矩形分割
Jul 26 Python
Python numpy.array()生成相同元素数组的示例
Nov 12 Python
python dataframe向下向上填充,fillna和ffill的方法
Nov 28 Python
python 实现语音聊天机器人的示例代码
Dec 02 Python
django 2.2和mysql使用的常见问题
Jul 18 Python
基于Python的图像数据增强Data Augmentation解析
Aug 13 Python
Python二元算术运算常用方法解析
Sep 15 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 mssql 日期出现中文字符的解决方法
2009/03/10 PHP
PHP对象Object的概念 介绍
2012/06/14 PHP
ASP.NET MVC中EasyUI的datagrid跨域调用实现代码
2012/03/14 Javascript
js动态设置div的值下例子
2013/10/29 Javascript
button没写type=button会导致点击时提交
2014/03/06 Javascript
Javscript删除数组中指定元素并返回新数组
2014/03/06 Javascript
JQuery基础语法小结
2015/02/27 Javascript
javascript高级编程之函数表达式 递归和闭包函数
2015/11/29 Javascript
详解Vue-基本标签和自定义控件
2017/03/24 Javascript
简单谈谈关于Angular Cli打包的事
2017/09/05 Javascript
利用JS判断客户端类型你应该知道的四种方法
2017/12/22 Javascript
记React connect的几种写法(小结)
2018/09/18 Javascript
Next.js项目实战踩坑指南(笔记)
2018/11/29 Javascript
javascript 构建模块化开发过程解析
2019/09/11 Javascript
浅谈Layui的eleTree树式选择器使用方法
2019/09/25 Javascript
分享8个JavaScript库可更好地处理本地存储
2020/10/12 Javascript
[57:53]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#3OG VS VP
2016/03/03 DOTA
Python程序员鲜为人知但你应该知道的17个问题
2014/06/04 Python
python开发之文件操作用法实例
2015/11/13 Python
Python对象转JSON字符串的方法
2016/04/27 Python
利用Python代码实现数据可视化的5种方法详解
2018/03/25 Python
python 读入多行数据的实例
2018/04/19 Python
几行Python代码爬取3000+上市公司的信息
2019/01/24 Python
六行python代码的爱心曲线详解
2019/05/17 Python
简单了解python中的f.b.u.r函数
2019/11/02 Python
pytorch中tensor张量数据类型的转化方式
2019/12/31 Python
pytorch 限制GPU使用效率详解(计算效率)
2020/06/27 Python
在keras里实现自定义上采样层
2020/06/28 Python
python实现将中文日期转换为数字日期
2020/07/14 Python
在DELPHI中调用存储过程和使用内嵌SQL哪种方式更好
2016/11/22 面试题
公司经营目标责任书
2015/01/29 职场文书
技术员岗位职责范本
2015/04/11 职场文书
高中同学会致辞
2015/08/01 职场文书
公司中层管理培训心得体会
2016/01/11 职场文书
导游词之峨眉乐山/兵马俑/北京故宫御花园
2019/09/03 职场文书
解决Python中的modf()函数取小数部分不准确问题
2021/05/28 Python