Python 字符串池化的前提


Posted in Python onJuly 03, 2020

前言

在 Python 中经常通过内存池化技术来提高其性能,那么问题来了,在什么情况下会池化呢? 让我们通过几个例子进行一下理解一下.

预备知识

在查看例子之前,首先要提 python 中的一个函数 id(),让我们看一下函数说明:

id(obj, /)
  Return the identity of an object.

  This is guaranteed to be unique among simultaneously existing objects.
  (CPython uses the object \'s memory address.)

通过上述说明,可以得知 id() 将会返回对像的唯一标识,在 CPython 中将会返回内存地址,也就是说如果两个对象 的 id 值一样,可以说着两个对象是相同的了.

例子

example 00

a = ""
b = ""
print(id(a),id(b))
print(a is b)

输出结果:

>>> a = ""
>>> b = ""
>>> print(id(a),id(b))
2114853370544 2114853370544
>>> print(a is b)
True

example 01

a = "a"
b = "a"
print(id(a),id(b))
print(a is b)

输出结果:

>>> a = "a"
>>> b = "a"
>>> print(id(a),id(b))
2114883022608 2114883022608
>>> print(a is b)
True

example 02

a = "magic_string"
b = "magic" + "_" + "string"
print(id(a),id(b))
print(a is b)

输出结果:

>>> a = "magic_string"
>>> b = "magic" + "_" + "string"
>>> print(id(a),id(b))
2114887161136 2114887161136
>>> print(a is b)
True

example 03

a = "magic!"
b = "mgaic!"
print(id(a),id(b))
print(a is b)

输出结果:

>>> a = "magic!"
>>> b = "mgaic!"
>>> print(id(a),id(b))
2114885855416 2114889455408
>>> print(a is b)
False

example 04

a,b = "magic!","magic!"
print(id(a),id(b))
print(a is b)

输出结果:
>>> a,b = "magic!","magic!"
>>> print(id(a),id(b))
2114885691912 2114885691912
>>> print(a is b)
True

example 05

a = "!"
b = "!"
print(id(a),id(b))
print(a is b)

输出结果:

>>> a = "!"
>>> b = "!"
>>> print(id(a),id(b))
140564571922024 140564571922024
>>> print(a is b)
True

example 06

print(a*20 is 'aaaaaaaaaaaaaaaaaaaa')
print(a*21 is 'aaaaaaaaaaaaaaaaaaaaa')

输出结果:

>>> print(a*20 is 'aaaaaaaaaaaaaaaaaaaa')
False
>>> print(a*21 is 'aaaaaaaaaaaaaaaaaaaaa')
False

总结

通过上述 7 个例子,我们不难对 python 的字符串池化有个大概的认识,我们这里做个简单的总结:

  1. 通过 example 00,01,05,我们可以得出对于长度为 0 或者 1 的字符串会被池化
  2. 通过 example 02,03,我们可以得出字符串中只包含字母数字以及下划线的字符串会被池化
  3. 通过 example 04, 我们可以得出当在同一行对不同变量,赋值如果相同的话,它们将会指向同一个对象,注意这里面的 “magic!” 并不符合池化的要求,这只是一种编译器的优化
  4. example 06 所出现的现象在 python 中有一个专业的术语,讲常量折叠(constant folding),顾名思义,在编译优化时,讲能够计算出的结果的变量直接替换为常量.但是这没有限制吗?显然不是的,在我们的例子中已经发现,当长度超过20的时候,折叠就会失效了,试想一下,如果没有限制的话,初始化的字符串过长,将会严重导致性能的下降以及内存的消耗

参考链接

The internals of Python string interning

exploring python code objects

Python string interning

Python String objects implementation

以上就是Python 字符串池化的前提的详细内容,更多关于Python 字符串池化的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
实例说明Python中比较运算符的使用
May 13 Python
python实现文本文件合并
Dec 29 Python
Python合并字典键值并去除重复元素的实例
Dec 18 Python
Django框架教程之正则表达式URL误区详解
Jan 28 Python
Python实现自动上京东抢手机
Feb 06 Python
pymongo中group by的操作方法教程
Mar 22 Python
python实现大文件分割与合并
Jul 22 Python
Django Rest framework三种分页方式详解
Jul 26 Python
基于Python的微信机器人开发 微信登录和获取好友列表实现解析
Aug 21 Python
python连接打印机实现打印文档、图片、pdf文件等功能
Feb 07 Python
使用Python FastAPI构建Web服务的实现
Jun 08 Python
PyQt5 QThread倒计时功能的实现代码
Apr 02 Python
Pycharm打开已有项目配置python环境的方法
Jul 03 #Python
使用Dajngo 通过代码添加xadmin用户和权限(组)
Jul 03 #Python
windows支持哪个版本的python
Jul 03 #Python
Django Form设置文本框为readonly操作
Jul 03 #Python
完美解决TensorFlow和Keras大数据量内存溢出的问题
Jul 03 #Python
Keras 在fit_generator训练方式中加入图像random_crop操作
Jul 03 #Python
keras的三种模型实现与区别说明
Jul 03 #Python
You might like
一些星际专用术语解释
2020/03/04 星际争霸
php 论坛采集程序 模拟登陆,抓取页面 实现代码
2009/07/09 PHP
php自定义的格式化时间示例代码
2013/12/05 PHP
phplist及phpmailer(组合使用)通过gmail发送邮件的配置方法
2016/03/30 PHP
php生成毫秒时间戳的实例讲解
2017/09/22 PHP
div层的移动及性能优化
2010/11/16 Javascript
jQuery初学:find()方法及children方法的区别分析
2011/01/31 Javascript
基于Jquery+Ajax+Json的高效分页实现代码
2011/10/29 Javascript
jquery getScript动态加载JS方法改进详解
2012/11/15 Javascript
基于JavaScript实现屏幕滚动效果
2017/01/18 Javascript
vuejs指令详解
2017/02/07 Javascript
Bootstrap 设置datetimepicker在屏幕上面弹出设置方法
2017/03/21 Javascript
使用 Node.js 对文本内容分词和关键词抽取
2017/05/27 Javascript
angularjs实现过滤并替换关键字小功能
2017/09/19 Javascript
vuex 的简单使用
2018/03/22 Javascript
手把手15分钟搭一个企业级脚手架
2019/09/16 Javascript
vue 翻页组件vue-flip-page效果
2020/02/05 Javascript
vue 弹出遮罩层样式实例
2020/07/22 Javascript
vant 解决tab切换插件标题样式自定义的问题
2020/11/13 Javascript
原生js+canvas实现验证码
2020/11/29 Javascript
[01:52]2014DOTA2西雅图邀请赛 V社开大会你不知道的小秘密
2014/07/08 DOTA
使用Python读写及压缩和解压缩文件的示例
2016/07/08 Python
windows上安装python3教程以及环境变量配置详解
2019/07/18 Python
基于Python脚本实现邮件报警功能
2020/05/20 Python
MAC平台基于Python Appium环境搭建过程图解
2020/08/13 Python
python源文件的字符编码知识点详解
2021/03/04 Python
HTML5实现晶莹剔透的雨滴特效
2014/05/14 HTML / CSS
Eastbay官网:美国最大的运动鞋网络零售商
2016/07/27 全球购物
Spartoo英国:欧洲最大的网上鞋店
2016/09/13 全球购物
DJI大疆无人机官方商城:全球领先的无人飞行器研发和生产商
2016/12/21 全球购物
加拿大在线隐形眼镜和眼镜店:VisionPros
2019/10/06 全球购物
商务主管岗位职责
2013/12/08 职场文书
小学优秀班主任事迹材料
2014/05/17 职场文书
人大代表选举标语
2014/10/07 职场文书
考试作弊检讨书1000字(5篇)
2014/10/19 职场文书
JDK8中String的intern()方法实例详细解读
2022/09/23 Java/Android