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采集博客中上传的QQ截图文件
Jul 18 Python
python采集百度百科的方法
Jun 05 Python
Python中字符串的修改及传参详解
Nov 30 Python
Python中pow()和math.pow()函数用法示例
Feb 11 Python
使用 Python 实现简单的 switch/case 语句的方法
Sep 17 Python
python使用matplotlib绘制热图
Nov 07 Python
python opencv捕获摄像头并显示内容的实现
Jul 11 Python
python实现猜数字游戏
Mar 25 Python
在OpenCV里使用Camshift算法的实现
Nov 22 Python
Python利用matplotlib绘制约数个数统计图示例
Nov 26 Python
详解Python3中的 input() 函数
Mar 18 Python
OpenCV-Python实现轮廓的特征值
Jun 09 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
成本8450万,票房仅2亿,口碑两极分化,又一部DC电影扑街了
2020/04/09 欧美动漫
使用ThinkPHP自带的Http类下载远程图片到本地的实现代码
2011/08/02 PHP
关于PHP堆栈与列队的学习
2013/06/21 PHP
20个2014年最优秀的PHP框架回顾
2014/10/22 PHP
smarty模板引擎之配置文件数据和保留数据
2015/03/30 PHP
php版微信公众号接口实现发红包的方法
2016/10/14 PHP
PHP 网站修改默认访问文件的nginx配置
2017/05/27 PHP
laravel按天、按小时,查询数据的实例
2019/10/09 PHP
PHP 数组操作详解【遍历、指针、函数等】
2020/05/13 PHP
枚举JavaScript对象的函数
2006/12/22 Javascript
jQuery学习笔记之 Ajax操作篇(三) - 过程处理
2014/06/23 Javascript
node.js中的fs.fchownSync方法使用说明
2014/12/16 Javascript
jQuery滚动条插件nanoscroller使用指南
2015/04/21 Javascript
js实现的后台左侧管理菜单代码
2015/09/11 Javascript
json格式数据的添加,删除及排序方法
2016/01/21 Javascript
js通过Date对象实现倒计时动画效果
2017/10/27 Javascript
使用ef6创建oracle数据库的实体模型遇到的问题及解决方案
2017/11/09 Javascript
基于vue-upload-component封装一个图片上传组件的示例
2018/10/16 Javascript
JavaScript遍历DOM元素的常见方式示例
2019/02/16 Javascript
Nodejs中怎么实现函数的串行执行
2019/03/02 NodeJs
Node4-5静态资源服务器实战以及优化压缩文件实例内容
2019/08/29 Javascript
Javascript执行上下文顺序的深入讲解
2020/11/04 Javascript
element-ui点击查看大图的方法示例
2020/12/14 Javascript
python+opencv实现动态物体识别
2018/01/09 Python
PyQt4实现下拉菜单可供选择并打印出来
2018/04/20 Python
django多对多表的创建,级联删除及手动创建第三张表
2019/07/25 Python
python用WxPython库实现无边框窗体和透明窗体实现方法详解
2020/02/21 Python
实现ECharts双Y轴左右刻度线一致的例子
2020/05/16 Python
建设工程授权委托书
2014/09/22 职场文书
2015年信访维稳工作总结
2015/04/07 职场文书
同意离婚答辩状
2015/05/22 职场文书
幼儿园园长工作总结2015
2015/05/25 职场文书
忠犬八公的故事观后感
2015/06/05 职场文书
python如何利用cv2模块读取显示保存图片
2021/06/04 Python
MySQL系列之开篇 MySQL关系型数据库基础概念
2021/07/02 MySQL
SQL中去除重复数据的几种方法汇总(窗口函数对数据去重)
2023/05/08 MySQL