浅析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实现二分查找算法实例
May 26 Python
python开发利器之ulipad的使用实践
Mar 16 Python
Python正则表达式常用函数总结
Jun 24 Python
python删除不需要的python文件方法
Apr 24 Python
解决PyCharm import torch包失败的问题
Oct 13 Python
使用python批量化音乐文件格式转换的实例
Jan 09 Python
通过celery异步处理一个查询任务的完整代码
Nov 19 Python
python 经典数字滤波实例
Dec 16 Python
Pytorch对Himmelblau函数的优化详解
Feb 29 Python
基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)
Apr 29 Python
tensorflow 大于某个值为1,小于为0的实例
Jun 30 Python
virtualenv隔离Python环境的问题解析
Jun 21 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
异世界新番又来了,同样是从零开始,男主的年龄降到5岁
2020/04/09 日漫
php 页面执行时间计算代码
2008/12/04 PHP
cakephp打印sql语句的方法
2015/02/13 PHP
PHP+mysql实现从数据库获取下拉树功能示例
2017/01/06 PHP
php实现微信原生支付(扫码支付)功能
2018/05/30 PHP
javascript import css实例代码
2008/07/18 Javascript
浅析showModalDialog数据缓存问题(用禁止浏览器缓存解决)
2013/07/09 Javascript
Nodejs实现的一个简单udp广播服务器、客户端
2014/09/25 NodeJs
$("").click与onclick的区别示例介绍
2014/09/25 Javascript
JavaScript实现把数字转换成中文
2015/06/29 Javascript
jQuery中$.ajax()和$.getJson()同步处理详解
2015/08/12 Javascript
理解 JavaScript Scoping & Hoisting(二)
2015/11/18 Javascript
Javascript实现检测客户端类型代码封包
2015/12/03 Javascript
深入浅析ES6 Class 中的 super 关键字
2017/10/20 Javascript
Vue filter介绍及详细使用
2018/04/04 Javascript
Vuerouter的beforeEach与afterEach钩子函数的区别
2018/12/26 Javascript
JavaScript实现随机点名器
2020/03/25 Javascript
[01:02]DOTA2上海特锦赛SHOWOPEN
2016/03/25 DOTA
python实现随机密码字典生成器示例
2014/04/09 Python
Python爬虫之模拟知乎登录的方法教程
2017/05/25 Python
python3模块smtplib实现发送邮件功能
2018/05/22 Python
pandas使用之宽表变窄表的实现
2020/04/12 Python
用python制作个视频下载器
2021/02/01 Python
Python 转移文件至云对象存储的方法
2021/02/07 Python
MIKI HOUSE美国官方网上商店:日本领先的婴儿和儿童高级时装品牌
2020/06/21 全球购物
网络工程与软件技术毕业生自荐信
2013/09/24 职场文书
优秀幼教自荐信
2014/02/03 职场文书
禁毒宣传工作方案
2014/05/23 职场文书
员工团队活动方案
2014/08/28 职场文书
升学宴家长致辞
2015/07/27 职场文书
小学班级管理心得体会
2016/01/07 职场文书
本地通过nginx配置反向代理的全过程记录
2021/03/31 Servers
MySQL连表查询分组去重的实现示例
2021/07/01 MySQL
英国数字版游戏销量周榜公布 《小缇娜的奇幻之地》登顶
2022/04/03 其他游戏
SQL解决未能删除约束问题drop constraint
2022/05/30 SQL Server
Go语言编译原理之源码调试
2022/08/05 Golang