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 15 Python
python的Crypto模块实现AES加密实例代码
Jan 22 Python
Python装饰器(decorator)定义与用法详解
Feb 09 Python
python+Splinter实现12306抢票功能
Sep 25 Python
使用pip发布Python程序的方法步骤
Oct 11 Python
matplotlib实现热成像图colorbar和极坐标图的方法
Dec 13 Python
python做反被爬保护的方法
Jul 01 Python
django使用haystack调用Elasticsearch实现索引搜索
Jul 24 Python
Django之PopUp的具体实现方法
Aug 31 Python
python实现加密的方式总结
Jan 19 Python
Django模板标签中url使用详解(url跳转到指定页面)
Mar 19 Python
python argparse传入布尔参数false不生效的解决
Apr 20 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
php简单静态页生成过程
2008/03/27 PHP
php实现的在线人员函数库
2008/04/09 PHP
php中长文章分页显示实现代码
2012/09/29 PHP
关于shopex同步ucenter的redirect问题,导致script不运行
2013/04/10 PHP
php实现执行某一操作时弹出确认、取消对话框
2013/12/30 PHP
Yii2创建多界面主题(Theme)的方法
2016/10/08 PHP
PHP isset()与empty()的使用区别详解
2017/02/10 PHP
PHP编程实现多维数组按照某个键值排序的方法小结【2种方法】
2017/04/27 PHP
JS数组去重与取重的示例代码
2014/01/24 Javascript
详解jQuery向动态生成的内容添加事件响应jQuery live()方法
2015/11/02 Javascript
JavaScript 节流函数 Throttle 详解
2016/07/04 Javascript
javascript实现图片左右滚动效果【可自动滚动,有左右按钮】
2016/09/19 Javascript
js仿微信语音播放实现思路
2016/12/12 Javascript
Bootstrap Tooltip显示换行和左对齐的解决方案
2017/10/11 Javascript
Angular2的管道Pipe的使用方法
2017/11/07 Javascript
Nginx设置为Node.js的前端服务器方法总结
2019/03/27 Javascript
Vue组件通信的几种实现方法
2019/04/25 Javascript
简单学习5种处理Vue.js异常的方法
2019/06/17 Javascript
微信小程序一周时间表功能实现
2019/10/17 Javascript
vue用ant design中table表格,点击某行时触发的事件操作
2020/10/28 Javascript
python基础教程之类class定义使用方法
2014/02/20 Python
Python中字符串的处理技巧分享
2016/09/17 Python
python spyder中读取txt为图片的方法
2018/04/27 Python
Python爬虫包BeautifulSoup学习实例(五)
2018/06/17 Python
使用python制作一个解压缩软件
2019/11/13 Python
Python unittest框架操作实例解析
2020/04/13 Python
英国著名国际平价时尚男装品牌:Topman
2016/08/27 全球购物
中科软笔试题和面试题
2014/10/07 面试题
机械专业毕业生自荐信
2013/11/02 职场文书
电子专业毕业生自我鉴定
2014/01/22 职场文书
完整版商业计划书
2014/09/15 职场文书
2014党委书记四风问题对照检查材料思想汇报
2014/09/22 职场文书
长城的导游词
2015/01/30 职场文书
土建施工员岗位职责
2015/04/11 职场文书
2016党员干部反腐倡廉心得体会
2016/01/13 职场文书
使用Pytorch实现two-head(多输出)模型的操作
2021/05/28 Python