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 06 Python
python 回调函数和回调方法的实现分析
Mar 23 Python
深入浅析python定时杀进程
Jun 06 Python
Python实现的多项式拟合功能示例【基于matplotlib】
May 15 Python
pandas.DataFrame选取/排除特定行的方法
Jul 03 Python
用Anaconda安装本地python包的方法及路径问题(图文)
Jul 16 Python
Django 数据库同步操作技巧详解
Jul 19 Python
Python使用Socket实现简单聊天程序
Feb 28 Python
解决python便携版无法直接运行py文件的问题
Sep 01 Python
python 如何区分return和yield
Sep 22 Python
Python中正则表达式对单个字符,多个字符和匹配边界等使用
Jan 27 Python
Pytorch 中的optimizer使用说明
Mar 03 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
一个程序下载的管理程序(二)
2006/10/09 PHP
PHP 数据结构 算法 三元组 Triplet
2011/07/02 PHP
Yii学习总结之数据访问对象 (DAO)
2015/02/22 PHP
浅谈PHP中foreach/in_array的使用
2015/11/02 PHP
[原创]PHP实现逐行删除文件右侧空格的方法
2015/12/25 PHP
PHP格式化显示时间date()函数代码
2018/10/03 PHP
PHP判断一个变量是否为整数、正整数的方法示例
2019/09/11 PHP
javascritp实现input输入框相关限制用法
2007/06/29 Javascript
ExtJS 2.0实用简明教程 之获得ExtJS
2009/04/29 Javascript
纯javascript判断查询日期是否为有效日期
2015/08/24 Javascript
谷歌Chrome浏览器扩展程序开发小记
2016/01/06 Javascript
JavaScript实现给定时间相加天数的方法
2016/01/25 Javascript
Angular的事件和表单详解
2016/12/26 Javascript
完美的js图片轮换效果
2017/02/05 Javascript
js实现无缝轮播图效果
2020/03/09 Javascript
[20:30]职业巡回赛回顾
2018/08/09 DOTA
python合并文本文件示例
2014/02/07 Python
Python使用sorted排序的方法小结
2017/07/28 Python
python字符串与url编码的转换实例
2018/05/10 Python
win8下python3.4安装和环境配置图文教程
2018/07/31 Python
python 发送和接收ActiveMQ消息的实例
2019/01/30 Python
Python将string转换到float的实例方法
2019/07/29 Python
django model的update时auto_now不被更新的原因及解决方式
2020/04/01 Python
Python必须了解的35个关键词
2020/07/16 Python
Silk’n激光脱毛器官网:silkn.com
2016/10/06 全球购物
巴西补充剂和维生素购物网站:Natue
2019/06/17 全球购物
北京天润融通.net面试题笔试题
2012/02/20 面试题
介绍一下你对SOA的认识
2016/04/24 面试题
祖国在我心中演讲稿500字
2014/05/04 职场文书
创文明城市标语
2014/06/16 职场文书
工厂门卫的岗位职责
2014/07/27 职场文书
2014年学校党建工作汇报材料
2014/11/02 职场文书
主持人开场白台词
2015/05/29 职场文书
礼貌问候语大全
2015/11/10 职场文书
使用Python脚本对GiteePages进行一键部署的使用说明
2021/05/27 Python
nginx配置限速限流基于内置模块
2022/05/02 Servers