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在校内发人人网状态(人人网看状态)
Feb 19 Python
Python实现Linux下守护进程的编写方法
Aug 22 Python
使用70行Python代码实现一个递归下降解析器的教程
Apr 17 Python
Python 文件管理实例详解
Nov 10 Python
使用Python神器对付12306变态验证码
Jan 05 Python
Python 稀疏矩阵-sparse 存储和转换
May 27 Python
python中实现延时回调普通函数示例代码
Sep 08 Python
pycharm执行python时,填写参数的方法
Oct 29 Python
python多进程下实现日志记录按时间分割
Jul 22 Python
使用Python为中秋节绘制一块美味的月饼
Sep 11 Python
学习Python需要哪些工具
Sep 04 Python
用Python selenium实现淘宝抢单机器人
Jun 18 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 将bmp图片转为jpg等其他任意格式的图片
2009/06/21 PHP
巧用php中的array_filter()函数去掉多维空值的代码分享
2012/09/07 PHP
解析curl提交GET,POST,Cookie的简单方法
2013/06/29 PHP
php操作xml入门之cdata区段
2015/01/23 PHP
Laravel5.1 框架表单验证操作实例详解
2020/01/07 PHP
PHP7移除的扩展和SAPI
2021/03/09 PHP
JavaScript 判断用户输入的邮箱及手机格式是否正确
2013/12/08 Javascript
javascript移动设备Web开发中对touch事件的封装实例
2014/06/05 Javascript
JS在IE下缺少标识符的错误
2014/07/23 Javascript
javascript使用正则表达式实现去掉空格之后的字符
2015/02/15 Javascript
JavaScript将XML转成JSON的方法
2015/03/12 Javascript
JavaScript中的函数嵌套使用
2015/06/04 Javascript
JQuery validate插件Remote用法大全
2016/05/15 Javascript
Angular.JS中的指令引用template与指令当做属性详解
2017/03/30 Javascript
利用prop-types第三方库对组件的props中的变量进行类型检测
2017/05/02 Javascript
JavaScript解析任意形式的json树型结构展示
2017/07/23 Javascript
详解webpack编译多页面vue项目的配置问题
2017/12/11 Javascript
VeeValidate 的使用场景以及配置详解
2019/01/11 Javascript
vue使用高德地图点击下钻上浮效果的实现思路
2019/10/12 Javascript
webpack.DefinePlugin与cross-env区别详解
2020/02/23 Javascript
[00:58]2016年国际邀请赛勇士令状宣传片
2016/06/01 DOTA
python应用程序在windows下不出现cmd窗口的办法
2014/05/29 Python
在pandas中一次性删除dataframe的多个列方法
2018/04/10 Python
Python 实现Serial 与STM32J进行串口通讯
2019/12/18 Python
python 插入日期数据到Oracle实例
2020/03/02 Python
美国隐形眼镜销售网站:ContactsDirect
2017/10/28 全球购物
Gap工厂店:Gap Factory
2017/11/02 全球购物
孤独星球出版物:Lonely Planet Publications
2018/03/17 全球购物
Hoka One One法国官网:美国专业跑鞋品牌
2018/12/29 全球购物
介绍一下代理模式(Proxy)
2014/10/17 面试题
酒店中秋节促销方案
2014/01/30 职场文书
安全生产管理合理化建议书
2014/03/12 职场文书
入党思想汇报怎么写
2014/04/03 职场文书
群众路线教育实践活动心得体会(四风)
2014/11/03 职场文书
初中班主任教育随笔
2015/08/15 职场文书
如何做好工作总结!
2019/04/10 职场文书