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提取内容关键词的方法
Mar 16 Python
python和bash统计CPU利用率的方法
Jul 10 Python
Python之py2exe打包工具详解
Jun 14 Python
详解Python实现多进程异步事件驱动引擎
Aug 25 Python
Python读取word文本操作详解
Jan 22 Python
基于python实现聊天室程序
Jul 27 Python
Python和Java的语法对比分析语法简洁上python的确完美胜出
May 10 Python
Django实现文件上传下载
Oct 06 Python
pandas.DataFrame.drop_duplicates 用法介绍
Jul 06 Python
python 使用elasticsearch 实现翻页的三种方式
Jul 31 Python
python 根据列表批量下载网易云音乐的免费音乐
Dec 03 Python
python 如何把docker-compose.yaml导入到数据库相关条目里
Jan 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 静态页面中显示动态内容
2009/08/14 PHP
PHP5 操作MySQL数据库基础代码
2009/09/29 PHP
php遍历目录与文件夹的多种方法详解
2013/11/14 PHP
thinkphp 验证码 的使用小结
2017/05/07 PHP
浅析Prototype的模板类 Template
2011/12/07 Javascript
通过$(this)使用jQuery包装后的方法或属性
2014/05/18 Javascript
JavaScript实现的in_array函数
2014/08/27 Javascript
浅析js预加载/延迟加载
2014/09/25 Javascript
javascript实现的淘宝旅行通用日历组件用法实例
2015/08/03 Javascript
基于JavaScript实现瀑布流效果(循环渐近)
2016/01/27 Javascript
bootstrap和jQuery.Gantt的css冲突 如何解决
2016/05/29 Javascript
jQuery Ztree行政地区树状展示(点击加载)
2016/11/09 Javascript
JS中如何实现Laravel的route函数详解
2017/02/12 Javascript
完美解决UI-Grid表格元素中多个空格显示为一个空格的问题
2017/04/25 Javascript
jQuery实现table中两列CheckBox只能选中一个的示例
2017/09/22 jQuery
Node.JS用纯JavaScript生成图片或滑块式验证码功能
2019/09/12 Javascript
JS co 函数库的含义和用法实例总结
2020/04/08 Javascript
node.js基础知识汇总
2020/08/25 Javascript
Python 匹配任意字符(包括换行符)的正则表达式写法
2009/10/29 Python
python实现自动发送邮件发送多人、群发、多附件的示例
2018/01/23 Python
Python内置模块ConfigParser实现配置读写功能的方法
2018/02/12 Python
Pipenv一键搭建python虚拟环境的方法
2018/05/22 Python
用python生成(动态彩色)二维码的方法(使用myqr库实现)
2019/06/24 Python
Python如何省略括号方法详解
2020/03/21 Python
Anaconda+vscode+pytorch环境搭建过程详解
2020/05/25 Python
python+selenium+chrome实现淘宝购物车秒杀自动结算
2021/01/07 Python
法律工作求职自荐信
2013/10/31 职场文书
质检部部长职责
2013/12/16 职场文书
个人自荐书
2013/12/20 职场文书
自荐书4要点
2014/01/25 职场文书
学习雷锋寄语大全
2014/04/11 职场文书
《沙漠中的绿洲》教学反思
2014/04/24 职场文书
安康杯竞赛活动总结
2014/05/05 职场文书
改进作风怎么办发言材料
2014/08/17 职场文书
Mysql实现简易版搜索引擎的示例代码
2021/08/30 MySQL
实例详解Python的进程,线程和协程
2022/03/13 Python