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实现封装得到virustotal扫描结果
Oct 05 Python
Python检测一个对象是否为字符串类的方法
May 21 Python
PHP网页抓取之抓取百度贴吧邮箱数据代码分享
Apr 13 Python
Windows中安装使用Virtualenv来创建独立Python环境
May 31 Python
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
Mar 19 Python
python让列表倒序输出的实例
Jun 25 Python
Python基于OpenCV实现人脸检测并保存
Jul 23 Python
Python装饰器的应用场景代码总结
Apr 10 Python
python实现贪吃蛇双人大战
Apr 18 Python
python中scrapy处理项目数据的实例分析
Nov 22 Python
TensorFlow2.0使用keras训练模型的实现
Feb 20 Python
python基础入门之普通操作与函数(三)
Jun 13 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
Uchome1.2 1.5 代码学习 common.php
2009/04/24 PHP
一个典型的PHP分页实例代码分享
2011/07/28 PHP
那些年一起学习的PHP(一)
2012/03/21 PHP
Apache实现Web Server负载均衡详解(不考虑Session版)
2013/07/05 PHP
php计算title标题相似比的方法
2015/07/29 PHP
mouse_on_title.js
2006/08/25 Javascript
脚本吧 - 幻宇工作室用到js,超强推荐share.js
2006/12/23 Javascript
js中单引号与双引号冲突问题解决方法
2013/10/04 Javascript
JS 实现BASE64_ENCODE和BASE64_DECODE(实例代码)
2013/11/13 Javascript
javascript实现简单的Map示例介绍
2013/12/23 Javascript
Angular中的Promise对象($q介绍)
2015/03/03 Javascript
JavaScript动态添加style节点的方法
2015/06/09 Javascript
AngularJS学习笔记之ng-options指令
2015/06/16 Javascript
Angular.js如何从PHP读取后台数据
2016/03/24 Javascript
利用imgareaselect辅助后台实现图片上传裁剪
2017/03/02 Javascript
使用vue实现简单键盘的示例(支持移动端和pc端)
2017/12/25 Javascript
微信小程序实现图片预览功能
2018/01/31 Javascript
vue路由导航守卫和请求拦截以及基于node的token认证的方法
2019/04/07 Javascript
Vue2.X和Vue3.0数据响应原理变化的区别
2019/11/07 Javascript
微信小程序完美解决scroll-view高度自适应问题的方法
2020/08/08 Javascript
使用 Python 玩转 GitHub 的贡献板(推荐)
2019/04/04 Python
详解Python 4.0 预计推出的新功能
2019/07/26 Python
利用PyQt中的QThread类实现多线程
2020/02/18 Python
python实现FTP文件传输的方法(服务器端和客户端)
2020/03/20 Python
在pycharm中文件取消用 pytest模式打开的操作
2020/09/01 Python
Room Mate Hotels美国:西班牙酒店品牌
2018/04/10 全球购物
大二自我鉴定范文
2013/10/05 职场文书
培训主管岗位职责
2014/02/01 职场文书
生日宴会主持词
2014/03/20 职场文书
银行竞聘演讲稿
2014/05/16 职场文书
企业安全生产承诺书
2014/05/22 职场文书
学习保证书100字
2015/02/26 职场文书
宾馆安全管理制度
2015/08/06 职场文书
nginx部署多前端项目的几种方法
2021/05/25 Servers
Python中基础数据类型 set集合知识点总结
2021/08/02 Python
继承Win10缺点!教你关闭Win11烦人的网络搜索
2021/11/23 数码科技