浅析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实现数通设备tftp备份配置文件示例
Apr 02 Python
在Python中使用base64模块处理字符编码的教程
Apr 28 Python
Python对列表中的各项进行关联详解
Aug 15 Python
给你选择Python语言实现机器学习算法的三大理由
Nov 15 Python
解决python3 安装完Pycurl在import pycurl时报错的问题
Oct 15 Python
python中将正则过滤的内容输出写入到文件中的实例
Oct 21 Python
python爬取淘宝商品销量信息
Nov 16 Python
python实现公司年会抽奖程序
Jan 22 Python
python3.x+pyqt5实现主窗口状态栏里(嵌入)显示进度条功能
Jul 04 Python
python运用sklearn实现KNN分类算法
Oct 16 Python
Python 取numpy数组的某几行某几列方法
Oct 24 Python
python dict如何定义
Sep 02 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
分享下页面关键字抓取www.icbase.com站点代码(带asp.net参数的)
2014/01/30 PHP
PHP面向对象程序设计之接口用法
2014/08/20 PHP
PHP中余数、取余的妙用
2015/06/29 PHP
php文件上传、下载和删除示例
2020/08/28 PHP
php array_map使用自定义的函数处理数组中的每个值
2016/10/26 PHP
php 输出json及显示json中的中文汉字详解及实例
2016/11/09 PHP
PHP正则判断一个变量是否为正整数的方法
2019/02/27 PHP
ASP.NET jQuery 实例15 通过控件CustomValidator验证CheckBoxList
2012/02/03 Javascript
Flexigrid在IE下不显示数据的处理的解决方法
2013/10/24 Javascript
探讨js字符串数组拼接的性能问题
2014/10/11 Javascript
JQuery实现带排序功能的权限选择实例
2015/05/18 Javascript
跟我学习javascript的var预解析与函数声明提升
2015/11/16 Javascript
javascript数组克隆简单实现方法
2015/12/16 Javascript
Bootstrap与KnockoutJs相结合实现分页效果实例详解
2016/05/03 Javascript
Restify中接入Socket.io报Error:Can’t set headers的错误解决
2017/03/28 Javascript
微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
2017/04/18 Javascript
浅谈JavaScript中的属性:如何遍历属性
2017/09/14 Javascript
今天,小程序正式支持 SVG
2019/04/20 Javascript
vue和better-scroll实现列表左右联动效果详解
2019/04/29 Javascript
js getBoundingClientRect使用方法详解
2019/07/17 Javascript
vue+vant-UI框架实现购物车的复选框全选和反选功能
2019/11/05 Javascript
jQuery实现简单三级联动效果
2020/09/05 jQuery
Python中asyncore的用法实例
2014/09/29 Python
python 定义n个变量方法 (变量声明自动化)
2018/11/10 Python
Python 数据库操作 SQLAlchemy的示例代码
2019/02/18 Python
在Ubuntu 20.04中安装Pycharm 2020.1的图文教程
2020/04/30 Python
PyQt5 控件字体样式等设置的实现
2020/05/13 Python
Canvas制作旋转的太极的示例
2018/03/09 HTML / CSS
复古服装:RetroStage
2019/05/10 全球购物
2015年企业新年寄语
2014/12/08 职场文书
大学生考试作弊被抓检讨书
2014/12/27 职场文书
工程部文员岗位职责
2015/02/04 职场文书
刑事法律意见书
2015/06/04 职场文书
百日宴上的祝酒词
2015/08/10 职场文书
Python实现生成bmp图像的方法
2021/06/13 Python
vue组件vue-esign实现电子签名
2022/04/21 Vue.js