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 相关文章推荐
Mac下Supervisor进程监控管理工具的安装与配置
Dec 16 Python
初步解析Python中的yield函数的用法
Apr 03 Python
详解Python发送邮件实例
Jan 10 Python
python中matplotlib的颜色及线条控制的示例
Mar 16 Python
在python中以相同顺序shuffle两个list的方法
Dec 13 Python
python绘制漏斗图步骤详解
Mar 04 Python
Python地图绘制实操详解
Mar 04 Python
python3实现的zip格式压缩文件夹操作示例
Aug 17 Python
python如何保证输入键入数字的方法
Aug 23 Python
Python tcp传输代码实例解析
Mar 18 Python
Win10环境中如何实现python2和python3并存
Jul 20 Python
使用Python获取爱奇艺电视剧弹幕数据的示例代码
Jan 12 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
人工智能开始玩《星际争霸2》 你的操作跟得上吗?
2017/08/11 星际争霸
PHP中限制IP段访问、禁止IP提交表单的代码
2011/04/23 PHP
PHP学习笔记之字符串编码的转换和判断
2014/05/22 PHP
PHP exif扩展方法开启详解
2014/07/28 PHP
php将图片保存入mysql数据库失败的解决方法
2014/12/27 PHP
win平台安装配置Nginx+php+mysql 环境
2016/01/12 PHP
Zend Framework入门之环境配置及第一个Hello World示例(附demo源码下载)
2016/03/21 PHP
php中file_get_contents()函数用法实例
2019/02/21 PHP
javascript DOM编程实例(智播客学习)
2009/11/23 Javascript
js函数获取html中className所在的内容并去除标签
2013/09/08 Javascript
表单元素与非表单元素刷新区别详细解析
2013/11/06 Javascript
JavaScript简单实现网页回到顶部功能
2013/11/12 Javascript
详解JS 比较两个Json对象的值是否相等的实例
2013/11/20 Javascript
jquery 表格排序、实时搜索表格内容(附图)
2014/05/19 Javascript
vue实现微信分享朋友圈,发送朋友的示例讲解
2018/02/10 Javascript
vue的安装及element组件的安装方法
2018/03/09 Javascript
通过vue提供的keep-alive减少对服务器的请求次数
2018/04/01 Javascript
在vue中给列表中的奇数行添加class的实现方法
2018/09/05 Javascript
python基础教程之获取本机ip数据包示例
2014/02/10 Python
Python学习笔记整理3之输入输出、python eval函数
2015/12/14 Python
详解 Python 读写XML文件的实例
2017/08/02 Python
Python中getpass模块无回显输入源码解析
2018/01/11 Python
python2.7安装图文教程
2018/03/13 Python
python读取txt文件并取其某一列数据的示例
2019/02/19 Python
对Tensorflow中Device实例的生成和管理详解
2020/02/04 Python
Pycharm如何运行.py文件的方法步骤
2020/03/03 Python
Python集成开发工具Pycharm的安装和使用详解
2020/03/18 Python
Python 使用生成器代替线程的方法
2020/08/04 Python
浅谈python 类方法/静态方法
2020/09/18 Python
HTML5在IE10、火狐下中文乱码问题的解决方法
2013/11/18 HTML / CSS
会计学个人自荐信模板
2013/12/13 职场文书
党员群众路线整改措施及今后努力方向
2014/10/28 职场文书
优秀教师申报材料
2014/12/16 职场文书
党员个人总结自评
2015/02/14 职场文书
优秀英文求职信范文
2015/03/19 职场文书
Django展示可视化图表的多种方式
2021/04/08 Python