浅析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 相关文章推荐
python实现哈希表
Feb 07 Python
Python库urllib与urllib2主要区别分析
Jul 13 Python
Python兔子毒药问题实例分析
Mar 05 Python
尝试用最短的Python代码来实现服务器和代理服务器
Jun 23 Python
Django实现组合搜索的方法示例
Jan 23 Python
python中的内置函数max()和min()及mas()函数的高级用法
Mar 29 Python
解决Python下json.loads()中文字符出错的问题
Dec 19 Python
如何用C代码给Python写扩展库(Cython)
May 17 Python
Python将string转换到float的实例方法
Jul 29 Python
flask框架自定义过滤器示例【markdown文件读取和展示功能】
Nov 08 Python
Python3爬虫中关于中文分词的详解
Jul 29 Python
pycharm中如何自定义设置通过“ctrl+滚轮”进行放大和缩小实现方法
Sep 16 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
php中HTTP_REFERER函数用法实例
2014/11/21 PHP
Yii中CGridView实现批量删除的方法
2015/12/28 PHP
关于PHP文件的自动运行方法分析
2016/05/13 PHP
PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】
2019/06/14 PHP
jquery lazyload延迟加载技术的实现原理分析
2011/01/24 Javascript
页面右下角弹出提示框示例代码js版
2013/08/02 Javascript
浅谈Javascript中substr和substring的区别
2015/09/30 Javascript
关于function类中定义变量this的简单说明
2016/05/28 Javascript
基于JS实现无缝滚动思路及代码分享
2016/06/07 Javascript
jquery日历插件e-calendar升级版
2016/11/10 Javascript
基于vuejs实现一个todolist项目
2017/04/11 Javascript
解决bootstrap中下拉菜单点击后不关闭的问题
2018/08/10 Javascript
vue form 表单提交后刷新页面的方法
2018/09/04 Javascript
Vue 监听列表item渲染事件方法
2018/09/06 Javascript
jquery无缝图片轮播组件封装
2020/11/25 jQuery
Vue 中如何将函数作为 props 传递给组件的实现代码
2020/05/12 Javascript
[03:57]《不朽》——2015DOTA2国际邀请赛—中国军团出征主题曲MV
2015/07/15 DOTA
[54:47]Liquid vs VP Supermajor决赛 BO 第五场 6.10
2018/07/05 DOTA
Python删除指定目录下过期文件的2个脚本分享
2014/04/10 Python
Python 2.7.x 和 3.x 版本的重要区别小结
2014/11/28 Python
python实现字符串和日期相互转换的方法
2015/05/13 Python
Python使用ntplib库同步校准当地时间的方法
2016/07/02 Python
浅谈django开发者模式中的autoreload是如何实现的
2017/08/18 Python
python使用xpath中遇到:到底是什么?
2018/01/04 Python
python logging 重复写日志问题解决办法详解
2020/08/04 Python
python爬虫爬取淘宝商品比价(附淘宝反爬虫机制解决小办法)
2020/12/03 Python
任意一块网页内容实现“活”的背景(目前火狐浏览器专有)
2014/05/07 HTML / CSS
英国航空官网:British Airways
2016/09/11 全球购物
struct和class的区别
2015/11/20 面试题
商场拾金不昧表扬信
2014/01/13 职场文书
元宵节主持词
2014/03/25 职场文书
银行资信证明
2015/06/17 职场文书
《刷子李》教学反思
2016/02/20 职场文书
nginx服务器的下载安装与使用详解
2021/08/02 Servers
Spring Cloud 中@FeignClient注解中的contextId属性详解
2021/09/25 Java/Android
vue 自定义的组件绑定点击事件
2022/04/21 Vue.js