浅析Python中字符串的intern机制


Posted in Python onOctober 03, 2020

intern机制:

字符串类型作为Python中最常用的数据类型之一,Python解释器为了提高字符串使用的效率和使用性能,做了很多优化,例如:Python解释器中使用了 intern(字符串驻留)的技术来提高字符串效率,什么是intern机制?即值同样的字符串对象仅仅会保存一份,放在一个字符串储蓄池中,是共用的,当然,肯定不能改变,这也决定了字符串必须是不可变对象。

简单原理:

实现 Intern 机制的方式非常简单,就是通过维护一个字符串储蓄池,这个池子是一个字典结构,如果字符串已经存在于池子中就不再去创建新的字符串,直接返回之前创建好的字符串对象,如果之前还没有加入到该池子中,则先构造一个字符串对象,并把这个对象加入到池子中去,方便下一次获取。

但是,解释器内部对intern 机制的使用策略是有考究的,有些场景会自动使用intern ,有些地方需要通过手动方式才能启动,看下面几个常见的小陷阱。

  • 1.在shell中示例,并非全部的字符串都会采用intern机制。仅仅包括下划线、数字、字母的字符串才会被intern,当然不能超过20个字符。因为如果超过20个字符的话,解释器认为这个字符串不常用,不用放入字符串池中。
>>> s1="hello"
>>> s2="hello"
>>> s1 is s2
True# 如果有空格,默认不启用intern机制
>>> s1="hell o"
>>> s2="hell o"
>>> s1 is s2
False# 如果一个字符串长度超过20个字符,不启动intern机制
>>> s1 = "a" * 20
>>> s2 = "a" * 20
>>> s1 is s2
True
>>> s1 = "a" * 21
>>> s2 = "a" * 21
>>> s1 is s2
False
>>> s1 = "ab" * 10
>>> s2 = "ab" * 10
>>> s1 is s2
True
>>> s1 = "ab" * 11
>>> s2 = "ab" * 11
>>> s1 is s2
False
  • 2.但是在PyCharm中,只要是同一个字符串不超过20个字符,都为True,并不用是下划线、数字、字母的字符串。个人理解:IDE支持的不好。
s1 = "hell o"
s2 = "hell o"
print(s1 is s2) # True
s1 = "hell!*o"
s2 = "hell!*o"
print(s1 is s2) # True
s1 = "a" * 20
s2 = "a" * 20
print(s1 is s2) # True
s1 = "a" * 21
s2 = "a" * 21
print(s1 is s2) # False
s1 = "ab" * 10
s2 = "ab" * 10
print(s1 is s2) # True
s1 = "ab" * 11
s2 = "ab" * 11
print(s1 is s2) # False
  • 3.字符串拼接时,涉及编译运行问题
>>> s1 = "hell"
>>> s2 = "hello"
>>> s1 + "o" is s2
False
>>> "hell" + "o" is s2
True
>>>
# 说明shell和IDE在这方面没有差异
s1 = "hell"
s2 = "hello"
print(s1 + "o" is s2) # False
print("hell" + "o" is s2) # True#因为"hell" + "o"在编译时已经变成了"hello",而s1+"o"因为s1是一个变量,他们会在运行时进行拼接,所以没有被intern

作者:Nobita Chen
出处:http://www.cnblogs.com/chenshengkai/

以上就是浅析Python中字符串的intern机制的详细内容,更多关于python 字符串的intern机制的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python2.6版本中实现字典推导 PEP 274(Dict Comprehensions)
Apr 28 Python
解决tensorflow测试模型时NotFoundError错误的问题
Jul 27 Python
wtfPython—Python中一组有趣微妙的代码【收藏】
Aug 31 Python
在IPython中执行Python程序文件的示例
Nov 01 Python
python整小时 整天时间戳获取算法示例
Feb 20 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
Jun 17 Python
详细介绍Python进度条tqdm的使用
Jul 31 Python
python3 logging日志封装实例
Apr 08 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
Jun 11 Python
Pycharm如何自动生成头文件注释
Nov 14 Python
TensorFlow低版本代码自动升级为1.0版本
Feb 20 Python
Pygame Event事件模块的详细示例
Nov 17 Python
Python实现AES加密,解密的两种方法
Oct 03 #Python
python实现AdaBoost算法的示例
Oct 03 #Python
Django创建一个后台的基本步骤记录
Oct 02 #Python
Python中qutip用法示例详解
Oct 02 #Python
如何利用Python给自己的头像加一个小国旗(小月饼)
Oct 02 #Python
Python通过fnmatch模块实现文件名匹配
Sep 30 #Python
Python tempfile模块生成临时文件和临时目录
Sep 30 #Python
You might like
如何修改和添加Apache的默认站点目录
2013/07/05 PHP
php jquery 多文件上传简单实例
2013/12/23 PHP
PHP对象相互引用的内存溢出实例分析
2014/08/28 PHP
PHP对称加密函数实现数据的加密解密
2016/10/27 PHP
图片完美缩放
2006/09/07 Javascript
javascript计算星座属相(十二生肖属相)示例代码
2014/01/09 Javascript
在JavaScript中操作时间之setYear()方法的使用
2015/06/12 Javascript
js实现仿阿里巴巴城市选择框效果实例
2015/06/24 Javascript
js 获取当前web应用的上下文路径实现方法
2016/08/19 Javascript
创建一般js对象的几种方式
2017/01/19 Javascript
Node.js Express 框架 POST方法详解
2017/01/23 Javascript
js学习总结_轮播图之渐隐渐现版(实例讲解)
2017/07/17 Javascript
vue使用axios跨域请求数据问题详解
2017/10/18 Javascript
React Native实现地址挑选器功能
2017/10/24 Javascript
微信小程序实现流程进度的图样式功能
2018/01/16 Javascript
使用JS判断页面是首次被加载还是刷新
2019/05/26 Javascript
node.js使用net模块创建服务器和客户端示例【基于TCP协议】
2020/02/14 Javascript
详解Python中映射类型的内建函数和工厂函数
2015/08/19 Python
搭建Python的Django框架环境并建立和运行第一个App的教程
2016/07/02 Python
Python利用Beautiful Soup模块搜索内容详解
2017/03/29 Python
用Eclipse写python程序
2018/02/10 Python
Django框架使用内置方法实现登录功能详解
2019/06/12 Python
用python实现英文字母和相应序数转换的方法
2019/09/18 Python
pandas和spark dataframe互相转换实例详解
2020/02/18 Python
Python figure参数及subplot子图绘制代码
2020/04/18 Python
python 实现Harris角点检测算法
2020/12/11 Python
利用纯CSS3实现tab选项卡切换示例代码
2016/09/21 HTML / CSS
携程英文网站:Trip.com
2017/02/07 全球购物
用友笔试题目
2016/10/25 面试题
简述DNS进行域名解析的过程
2013/12/02 面试题
酒店总经理欢迎词
2014/01/15 职场文书
七年级政治教学反思
2014/02/03 职场文书
婚前协议书范本
2014/10/27 职场文书
Python实现滑雪小游戏
2021/09/25 Python
Element-ui Layout布局(Row和Col组件)的实现
2021/12/06 Vue.js
GTX1650super好不好 gtx1650super显卡属于什么级别
2022/04/08 数码科技