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 相关文章推荐
打开电脑上的QQ的python代码
Feb 10 Python
Python对象的深拷贝和浅拷贝详解
Aug 25 Python
Python的Urllib库的基本使用教程
Apr 30 Python
python与caffe改变通道顺序的方法
Aug 04 Python
python进行TCP端口扫描的实现
Dec 21 Python
对Python多线程读写文件加锁的实例详解
Jan 14 Python
django之使用celery-把耗时程序放到celery里面执行的方法
Jul 12 Python
Python在cmd上打印彩色文字实现过程详解
Aug 07 Python
PyTorch中常用的激活函数的方法示例
Aug 20 Python
python matplotlib包图像配色方案分享
Mar 14 Python
PyTorch实现重写/改写Dataset并载入Dataloader
Jul 14 Python
Python OpenCV实现图形检测示例详解
Apr 08 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
实现WordPress主题侧边栏切换功能的PHP脚本详解
2015/12/14 PHP
给WordPress的编辑后台添加提示框的代码实例分享
2015/12/25 PHP
PHP未登录自动跳转到登录页面
2016/12/21 PHP
js对象转json数组的简单实现案例
2014/02/28 Javascript
谷歌浏览器不支持showModalDialog模态对话框的解决方法
2014/09/22 Javascript
javascript原始值和对象引用实例分析
2015/04/25 Javascript
JavaScript中的Function函数
2015/08/27 Javascript
借助node实战JSONP跨域实例
2017/03/30 Javascript
微信小程序联网请求的轮播图
2017/07/07 Javascript
JS路由跳转的简单实现代码
2017/09/21 Javascript
vue 插值 v-once,v-text, v-html详解
2018/01/19 Javascript
详解Webpack-dev-server的proxy用法
2018/09/08 Javascript
详解vue beforeRouteEnter 异步获取数据给实例问题
2019/08/09 Javascript
Vue中jsx不完全应用指南小结
2019/11/01 Javascript
微信小程序实现电子签名功能
2020/07/29 Javascript
JavaScript实现通讯录功能
2020/12/27 Javascript
js属性对象的hasOwnProperty方法的使用
2021/02/05 Javascript
[02:36]DOTA2亚洲邀请赛小组赛精彩集锦:奇迹哥卡尔秀翻全场
2017/03/28 DOTA
python使用PyV8执行javascript代码示例分享
2013/12/04 Python
python中字典dict常用操作方法实例总结
2015/04/04 Python
通过mod_python配置运行在Apache上的Django框架
2015/07/22 Python
python 递归遍历文件夹,并打印满足条件的文件路径实例
2017/08/30 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
2017/11/30 Python
浅析Python数据处理
2018/05/02 Python
详解Python字符串切片
2019/05/20 Python
UI自动化定位常用实现方法代码示例
2020/10/27 Python
详解pycharm的python包opencv(cv2)无代码提示问题的解决
2021/01/29 Python
荷兰鞋类购物网站:Donelli
2019/05/24 全球购物
英国折扣高尔夫商店:Discount Golf Store
2019/11/19 全球购物
Zatchels官网:英国剑桥包品牌
2021/01/12 全球购物
精选干货:Java精选笔试题附答案
2014/01/18 面试题
酒店前台接待岗位职责
2013/12/03 职场文书
网吧消防安全制度
2014/01/28 职场文书
索赔员岗位职责
2015/02/15 职场文书
财务人员个人工作总结
2015/02/27 职场文书
《原神》新角色演示“神里绫人:林隐泓洄” 宠妹狂魔
2022/04/03 其他游戏