浅析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 相关文章推荐
Golang与python线程详解及简单实例
Apr 27 Python
Tensorflow环境搭建的方法步骤
Feb 07 Python
让Django支持Sql Server作后端数据库的方法
May 29 Python
Python django使用多进程连接mysql错误的解决方法
Oct 08 Python
在Python中实现shuffle给列表洗牌
Nov 08 Python
Python 保存矩阵为Excel的实现方法
Jan 28 Python
Python常用模块os.path之文件及路径操作方法
Dec 03 Python
python实现从wind导入数据
Dec 03 Python
解决Tensorboard 不显示计算图graph的问题
Feb 15 Python
python GUI库图形界面开发之PyQt5中QWebEngineView内嵌网页与Python的数据交互传参详细方法实例
Feb 26 Python
python 子类调用父类的构造函数实例
Mar 12 Python
Python中使用Selenium环境安装的方法步骤
Feb 22 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
ThinkPHP的RBAC(基于角色权限控制)深入解析
2013/06/17 PHP
php中\r \r\n \t的区别示例介绍
2014/02/08 PHP
php用户密码加密算法分析【Discuz加密算法】
2016/10/12 PHP
PHP中字符与字节的区别及字符串与字节转换示例
2016/10/15 PHP
JS IE和FF兼容性问题汇总
2009/02/09 Javascript
jquery 表格分页等操作实现代码(pagedown,pageup)
2010/04/11 Javascript
jquery获得下拉框值的代码
2011/08/13 Javascript
javascript基础之查找元素的详细介绍(访问节点)
2013/07/05 Javascript
JavaScript中的连字符详解
2013/11/28 Javascript
js实现键盘操作实现div的移动或改变的原理及代码
2014/06/23 Javascript
JavaScript的作用域和块级作用域概念理解
2014/09/21 Javascript
JavaScript如何自定义trim方法
2015/07/28 Javascript
javascript常用经典算法实例详解
2015/11/25 Javascript
深入剖析Express cookie-parser中间件实现示例
2018/02/01 Javascript
基于JS实现前端压缩上传图片的实例代码
2019/05/14 Javascript
webpack4手动搭建Vue开发环境实现todoList项目的方法
2019/05/16 Javascript
vue总线机制(bus)知识点详解
2020/05/10 Javascript
vue移动端写的拖拽功能示例代码
2020/09/09 Javascript
js观察者模式的弹幕案例
2020/11/23 Javascript
python抓取豆瓣图片并自动保存示例学习
2014/01/10 Python
Python实现获取本地及远程图片大小的方法示例
2018/07/21 Python
python Gunicorn服务器使用方法详解
2019/07/22 Python
python爬虫 2019中国好声音评论爬取过程解析
2019/08/26 Python
通过Python编写一个简单登录功能过程解析
2019/09/04 Python
Python 实现一个计时器
2020/07/28 Python
Python爬虫之Spider类用法简单介绍
2020/08/04 Python
PyQt5的QWebEngineView使用示例
2020/10/20 Python
python中Mako库实例用法
2020/12/31 Python
详解CSS的border边框属性及其在CSS3中的新特性
2016/05/10 HTML / CSS
日语专业推荐信
2013/11/12 职场文书
建材业务员岗位职责
2013/12/08 职场文书
问卷调查计划书
2014/01/10 职场文书
学校庆元旦歌咏比赛主持词
2014/03/18 职场文书
公司联欢晚会主持词
2014/03/22 职场文书
大学生学习计划书
2014/09/15 职场文书
python中urllib包的网络请求教程
2022/04/19 Python