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日志模块logging简介
Apr 13 Python
Python实现统计给定列表中指定数字出现次数的方法
Apr 11 Python
使用pandas的DataFrame的plot方法绘制图像的实例
May 24 Python
Python模拟登录的多种方法(四种)
Jun 01 Python
python人民币小写转大写辅助工具
Jun 20 Python
Python中实现单例模式的n种方式和原理
Nov 14 Python
使用pandas实现csv/excel sheet互相转换的方法
Dec 10 Python
jupyter notebook 实现matplotlib图动态刷新
Apr 22 Python
python实例化对象的具体方法
Jun 17 Python
python爬虫调度器用法及实例代码
Nov 30 Python
python爬虫基础之urllib的使用
Dec 31 Python
matplotlib更改窗口图标的方法示例
Feb 03 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
二次元帅气男生排行榜,只想悄悄收藏系列
2020/03/04 日漫
phpMyAdmin出现无法载入 mcrypt 扩展,请检查PHP配置的解决方法
2012/03/26 PHP
ThinkPHP实现将SESSION存入MYSQL的方法
2014/07/22 PHP
PHP中exec函数和shell_exec函数的区别
2014/08/20 PHP
Linux系统递归生成目录中文件的md5的方法
2015/06/29 PHP
[原创]PHP简单开启curl的方法(测试可行)
2016/01/11 PHP
Laravel框架基于ajax和layer.js实现无刷新删除功能示例
2019/01/17 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
JavaScript监测ActiveX控件是否已经安装过的代码
2008/09/02 Javascript
jQuery实现切换页面布局使用介绍
2011/10/09 Javascript
jQuery拖拽 & 弹出层 介绍与示例
2013/12/27 Javascript
JavaScript 里的类数组对象
2015/04/08 Javascript
jQuery地图map悬停显示省市代码分享
2015/08/20 Javascript
AngularJS使用指令增强标准表单元素功能
2016/07/01 Javascript
js中json处理总结之JSON.parse
2016/10/14 Javascript
浅谈js函数中的实例对象、类对象、局部变量(局部函数)
2016/11/20 Javascript
微信小程序顶部导航栏滑动tab效果
2019/01/28 Javascript
解决vue中使用proxy配置不同端口和ip接口问题
2019/08/14 Javascript
webpack常用构建优化策略小结
2019/11/21 Javascript
JavaScript实现随机点名器
2020/03/25 Javascript
js利用iframe实现选项卡效果
2020/08/09 Javascript
[02:20]DOTA2亚洲邀请赛 IG战队出场宣传片
2015/02/07 DOTA
Python笔记(叁)继续学习
2012/10/24 Python
Python的Flask框架中实现简单的登录功能的教程
2015/04/20 Python
Python入门学习指南分享
2018/04/11 Python
python3 遍历删除特定后缀名文件的方法
2018/04/23 Python
python 协程 gevent原理与用法分析
2019/11/22 Python
python 已知三条边求三角形的角度案例
2020/04/12 Python
Python爬虫使用bs4方法实现数据解析
2020/08/25 Python
Chain Reaction Cycles俄罗斯:世界上最大的在线自行车商店
2019/08/27 全球购物
湖南卫视在线视频媒体平台:芒果TV
2019/10/30 全球购物
网络管理员岗位职责
2014/03/17 职场文书
学习张林森心得体会
2014/09/10 职场文书
2015年财务试用期工作总结
2014/12/24 职场文书
关于Nginx中虚拟主机的一些冷门知识小结
2022/03/03 Servers
python区块链持久化和命令行接口实现简版
2022/05/25 Python