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实现端口复用实例代码
Jul 03 Python
python提取具有某种特定字符串的行数据方法
Dec 11 Python
python多线程+代理池爬取天天基金网、股票数据过程解析
Aug 13 Python
Python协程 yield与协程greenlet简单用法示例
Nov 22 Python
使用pandas的box_plot去除异常值
Dec 10 Python
基于Python和PyYAML读取yaml配置文件数据
Jan 13 Python
解决Python pip 自动更新升级失败的问题
Feb 21 Python
如何使用python写截屏小工具
Sep 29 Python
Python定时任务框架APScheduler原理及常用代码
Oct 05 Python
用python制作个视频下载器
Feb 01 Python
一行代码python实现文件共享服务器
Apr 22 Python
python用tkinter开发的扫雷游戏
Jun 01 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 快速生成 Flash 动画的方法
2007/03/06 PHP
Linux下进行MYSQL编程时插入中文乱码的解决方案
2007/03/15 PHP
CodeIgniter输出中文乱码的两种解决办法
2014/06/12 PHP
php实现网站顶踩功能的完整前端代码
2015/07/19 PHP
php图像验证码生成代码
2017/06/08 PHP
php用wangeditor3实现图片上传功能
2019/08/22 PHP
javascript一点特殊用法
2008/05/28 Javascript
在JavaScript中,为什么要尽可能使用局部变量?
2009/04/06 Javascript
javascript的onchange事件与jQuery的change()方法比较
2009/09/28 Javascript
由Javascript实现的页面日历
2011/11/04 Javascript
jQuery源码分析之Callbacks详解
2015/03/13 Javascript
BootStrap中Tab页签切换实例代码
2016/05/30 Javascript
Javascript中的迭代、归并方法详解
2016/06/14 Javascript
微信小程序 教程之条件渲染
2016/10/18 Javascript
详解nodejs微信公众号开发——5.素材管理接口
2017/04/11 NodeJs
使用Bootstrap + Vue.js实现表格的动态展示、新增和删除功能
2017/11/27 Javascript
Vue项目路由刷新的实现代码
2019/04/17 Javascript
使用 js 简单的实现 bind、call 、aplly代码实例
2019/09/07 Javascript
[42:25]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第三场
2018/04/06 DOTA
Python多线程学习资料
2012/12/19 Python
python爬虫实例详解
2018/06/19 Python
Django获取该数据的上一条和下一条方法
2019/08/12 Python
Python迷宫生成和迷宫破解算法实例
2019/12/24 Python
python 爬取马蜂窝景点翻页文字评论的实现
2020/01/20 Python
HTML5 Canvas自定义圆角矩形与虚线示例代码
2013/08/02 HTML / CSS
香港家用健身器材、运动器材及健康美容仪器专门店:FitBoxx
2019/12/05 全球购物
阿联酋优惠券服务:Living Kool
2019/12/12 全球购物
飞利信loadrunner和软件测试笔试题
2012/09/22 面试题
制冷与电控专业应届生求职信
2013/11/11 职场文书
医院总经理职责
2013/12/26 职场文书
火锅店营销方案
2014/02/26 职场文书
事业单位财务人员岗位职责
2015/04/14 职场文书
医院志愿者活动总结
2015/05/06 职场文书
离职证明范本
2015/06/12 职场文书
聊聊mysql都有哪几种分区方式
2022/04/13 MySQL
Python用any()函数检查字符串中的字母以及如何使用all()函数
2022/04/14 Python