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中将函数赋值给变量时需要注意的一些问题
Aug 18 Python
python中map()函数的使用方法示例
Sep 29 Python
python正则表达式及使用正则表达式的例子
Jan 22 Python
Python实现查看系统启动项功能示例
May 10 Python
python实现定时提取实时日志程序
Jun 22 Python
Linux上使用Python统计每天的键盘输入次数
Apr 17 Python
解决django 新增加用户信息出现错误的问题
Jul 28 Python
python+Django实现防止SQL注入的办法
Oct 31 Python
pytorch实现CNN卷积神经网络
Feb 19 Python
python递归函数求n的阶乘,优缺点及递归次数设置方式
Apr 02 Python
浅谈Django前端后端值传递问题
Jul 15 Python
django中ImageField的使用详解
Dec 21 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将数据库导出成excel的方法
2010/05/07 PHP
如何在PHP中使用正则表达式进行查找替换
2013/06/13 PHP
19个Android常用工具类汇总
2014/12/30 PHP
PHP读取大文件的多种方法介绍
2016/04/04 PHP
php上传excel表格并获取数据
2017/04/27 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
jQuery代码优化之基本事件
2011/11/01 Javascript
NodeJs中的非阻塞方法介绍
2012/06/05 NodeJs
jQuery编辑器KindEditor4.1.4代码高亮显示设置教程
2013/03/01 Javascript
一个简单的jQuery插件ajaxfileupload.js实现ajax上传文件例子
2014/06/26 Javascript
JS逆序遍历实现代码
2014/12/02 Javascript
javascript实现限制上传文件大小
2015/02/06 Javascript
Javascript基于AJAX回调函数传递参数实例分析
2015/12/15 Javascript
学习Node.js模块机制
2016/10/17 Javascript
微信小程序中form 表单提交和取值实例详解
2017/04/20 Javascript
Vue.js 单页面多路由区域操作的实例详解
2017/07/17 Javascript
微信小程序实现页面跳转传值的方法
2017/10/12 Javascript
JavaScript进阶(三)闭包原理与用法详解
2020/05/09 Javascript
详解JavaScript中new操作符的解析和实现
2020/09/04 Javascript
python简单判断序列是否为空的方法
2015/06/30 Python
Python字典数据对象拆分的简单实现方法
2017/12/05 Python
Django对数据库进行添加与更新的例子
2019/07/12 Python
详解用python计算阶乘的几种方法
2019/08/14 Python
Python迭代器模块itertools使用原理解析
2019/12/11 Python
TensorFlow打印输出tensor的值
2020/04/19 Python
解决python cv2.imread 读取中文路径的图片返回为None的问题
2020/06/02 Python
英国外籍人士的在线超市:British Corner Shop
2019/06/03 全球购物
销售人员自我评价
2014/02/01 职场文书
服务质量承诺书
2014/03/27 职场文书
单位推荐信范文
2015/03/27 职场文书
合同补充协议书
2016/03/24 职场文书
python中Tkinter 窗口之输入框和文本框的实现
2021/04/12 Python
Python基础知识之变量的详解
2021/04/14 Python
用python基于appium模块开发一个自动收取能量的小助手
2021/09/25 Python
SQL Server数据库查询出现阻塞之性能调优
2022/04/10 SQL Server
Windows Server 2016服务器用户管理及远程授权图文教程
2022/08/14 Servers