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 21 Python
Python使用pyodbc访问数据库操作方法详解
Jul 05 Python
Python关于excel和shp的使用在matplotlib
Jan 03 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
Sep 25 Python
python 生成器和迭代器的原理解析
Oct 12 Python
python查看数据类型的方法
Oct 12 Python
wxPython修改文本框颜色过程解析
Feb 14 Python
python3中datetime库,time库以及pandas中的时间函数区别与详解
Apr 16 Python
解决Python发送Http请求时,中文乱码的问题
Apr 30 Python
Django实现任意文件上传(最简单的方法)
Jun 03 Python
python如何随机生成高强度密码
Aug 19 Python
Pandas 稀疏数据结构的实现
Jul 25 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
第十节 抽象方法和抽象类 [10]
2006/10/09 PHP
PHP基于方差和标准差计算学生成绩的稳定性示例
2017/07/04 PHP
PHP设计模式之简单工厂和工厂模式实例分析
2019/03/25 PHP
ASP小贴士/ASP Tips javascript tips可以当桌面
2009/12/10 Javascript
基于jquery实现漂亮的动态信息提示效果
2011/08/02 Javascript
js用typeof方法判断undefined类型
2014/07/15 Javascript
js中substring和substr两者区别和使用方法
2015/11/09 Javascript
第一次接触神奇的Bootstrap表单
2016/07/27 Javascript
AngularJS实现一次监听多个值发生的变化
2016/08/31 Javascript
js实现表单及时验证功能 用户信息立即验证
2016/09/13 Javascript
jquery图片放大镜效果
2017/06/23 jQuery
JavaScript复制内容到剪贴板的两种常用方法
2018/02/27 Javascript
vue-cli 引入、配置axios的方法
2018/05/08 Javascript
vue和webpack项目构建过程常用的npm命令详解
2018/06/15 Javascript
Vue.js 父子组件通信的十种方式
2018/10/30 Javascript
Angular事件之不同组件间传递数据的方法
2018/11/15 Javascript
详解mpvue开发微信小程序基础知识
2019/09/23 Javascript
[06:45]2018DOTA2亚洲邀请赛 4.5 SOLO赛 Sccc vs Maybe
2018/04/06 DOTA
Python urlopen()函数 示例分享
2014/06/12 Python
使用Python神器对付12306变态验证码
2016/01/05 Python
Python 中 Meta Classes详解
2016/02/13 Python
python rsa 加密解密
2017/03/20 Python
windows下python之mysqldb模块安装方法
2017/09/07 Python
pandas每次多Sheet写入文件的方法
2018/12/10 Python
python内存动态分配过程详解
2019/07/15 Python
keras训练浅层卷积网络并保存和加载模型实例
2020/07/02 Python
解决redis与Python交互取出来的是bytes类型的问题
2020/07/16 Python
香港钟表珠宝首饰商城:OneMallTime网摩间
2016/10/14 全球购物
巴西葡萄酒销售网站:Wine.com.br
2017/11/07 全球购物
商务日语专业毕业生求职信
2013/10/26 职场文书
市场营销专业毕业生自荐信
2013/11/02 职场文书
工程部经理岗位职责
2013/12/08 职场文书
护理毕业生自荐信范文
2013/12/22 职场文书
入党转预备思想汇报
2014/01/07 职场文书
大学新生军训感言
2014/02/25 职场文书
基层领导干部“四风”问题批评与自我批评
2014/09/23 职场文书