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使用xmlrpc实例讲解
Dec 17 Python
python比较两个列表是否相等的方法
Jul 28 Python
在python的类中动态添加属性与生成对象
Sep 17 Python
Python绑定方法与非绑定方法详解
Aug 18 Python
利用python为运维人员写一个监控脚本
Mar 25 Python
python在openstreetmap地图上绘制路线图的实现
Jul 11 Python
python实现的批量分析xml标签中各个类别个数功能示例
Dec 30 Python
Python进程的通信Queue、Pipe实例分析
Mar 30 Python
在Django中自定义filter并在template中的使用详解
May 19 Python
浅谈Django前端后端值传递问题
Jul 15 Python
Django解决frame拒绝问题的方法
Dec 18 Python
PyQt 如何创建自定义QWidget
Mar 24 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根据年月获取季度的方法
2014/03/31 PHP
php编程每天必学之验证码
2016/03/03 PHP
PHP编写文件多服务器同步程序
2016/07/02 PHP
thinkphp分页实现效果
2016/10/13 PHP
php+mongodb判断坐标是否在指定多边形区域内的实例
2016/10/28 PHP
php中__toString()方法用法示例
2016/12/07 PHP
php读取本地json文件的实例
2018/03/07 PHP
javascript 面向对象编程 聊聊对象的事
2009/09/17 Javascript
input 和 textarea 输入框最大文字限制的jquery插件
2011/10/27 Javascript
jquery.cookie() 方法的使用(读取、写入、删除)
2013/12/05 Javascript
Js Jquery创建一个弹出层可加载一个页面
2014/05/08 Javascript
通过js来制作复选框的全选和不选效果
2014/05/22 Javascript
jQuery中wrapAll()方法用法实例
2015/01/16 Javascript
js实现iframe自动自适应高度的方法
2015/02/17 Javascript
简述AngularJS相关的一些编程思想
2015/06/23 Javascript
jQuery插件ImageDrawer.js实现动态绘制图片动画(附源码下载)
2016/02/25 Javascript
jQuery的extend方法【三种】
2016/12/14 Javascript
第一个Vue插件从封装到发布
2017/11/22 Javascript
JavaScript生成随机验证码代码实例
2019/09/28 Javascript
详解vue中$nextTick和$forceUpdate的用法
2019/12/11 Javascript
探究Python的Tornado框架对子域名和泛域名的支持
2015/05/02 Python
Python import用法以及与from...import的区别
2015/05/28 Python
windows下安装python的C扩展编译环境(解决Unable to find vcvarsall.bat)
2018/02/21 Python
详解python实现线程安全的单例模式
2018/03/05 Python
Python列表生成式与生成器操作示例
2018/08/01 Python
详解python3安装pillow后报错没有pillow模块以及没有PIL模块问题解决
2019/04/17 Python
django使用admin站点上传图片的实例
2019/07/28 Python
浅谈tensorflow中Dataset图片的批量读取及维度的操作详解
2020/01/20 Python
Python实现自动装机功能案例分析
2020/10/22 Python
升职自荐信范文
2013/10/05 职场文书
机械电子工程专业推荐信范文
2013/11/20 职场文书
网络书店创业计划书
2014/02/07 职场文书
活动宣传稿范文
2015/07/23 职场文书
使用Vue3+Vant组件实现App搜索历史记录功能(示例代码)
2021/06/09 Vue.js
SQLServer中exists和except用法介绍
2021/12/04 SQL Server
python神经网络Xception模型
2022/05/06 Python