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实现的希尔排序算法实例
Jul 01 Python
python获取元素在数组中索引号的方法
Jul 15 Python
Tornado协程在python2.7如何返回值(实现方法)
Jun 22 Python
Python实现的人工神经网络算法示例【基于反向传播算法】
Nov 11 Python
python入门前的第一课 python怎样入门
Mar 06 Python
pandas多级分组实现排序的方法
Apr 20 Python
Python3中的列表生成式、生成器与迭代器实例详解
Jun 11 Python
python读取图片并修改格式与大小的方法
Jul 24 Python
基于随机梯度下降的矩阵分解推荐算法(python)
Aug 31 Python
python调试神器PySnooper的使用
Jul 03 Python
Python基于内置库pytesseract实现图片验证码识别功能
Feb 24 Python
python中pathlib模块的基本用法与总结
Aug 17 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
input file获得文件根目录简单实现
2013/04/26 PHP
解析phpstorm + xdebug 远程断点调试
2013/06/20 PHP
PHP 快速排序算法详解
2014/11/10 PHP
PHP简单获取随机数的常用方法小结
2017/06/07 PHP
PHP receiveMail实现收邮件功能
2018/04/25 PHP
thinkPHP框架整合tcpdf插件操作示例
2018/08/07 PHP
JavaScript事件列表解说
2006/12/22 Javascript
JS特殊函数(Function()构造函数、函数直接量)区别介绍
2013/05/19 Javascript
window.onresize 多次触发的解决方法
2013/11/08 Javascript
使用text方法获取Html元素文本信息示例
2014/09/01 Javascript
基于NodeJS的前后端分离的思考与实践(六)Nginx + Node.js + Java 的软件栈部署实践
2014/09/26 NodeJs
Vue.js每天必学之指令系统与自定义指令
2016/09/07 Javascript
Javascript 详解封装from表单数据为json串进行ajax提交
2017/03/29 Javascript
ES6新特性八:async函数用法实例详解
2017/04/21 Javascript
React Router V4使用指南(精讲)
2018/09/17 Javascript
Element-ui中元素滚动时el-option超出元素区域的问题
2019/05/30 Javascript
uni-app 支持多端第三方地图定位的方法
2020/01/03 Javascript
[01:02:38]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第二场 1月10日
2021/03/11 DOTA
Python验证企业工商注册码
2015/10/25 Python
Python实现的调用C语言函数功能简单实例
2019/03/13 Python
在Tensorflow中实现梯度下降法更新参数值
2020/01/23 Python
Python如何自动获取目标网站最新通知
2020/06/18 Python
HTML5中外部浏览器唤起微信分享
2020/01/02 HTML / CSS
利用Node实现HTML5离线存储的方法
2020/10/16 HTML / CSS
KLOOK客路:发现更好玩的世界,预订独一无二的旅行体验
2016/12/16 全球购物
俄罗斯珠宝市场的领导者之一:Бронницкий ювелир
2019/10/02 全球购物
服装电子商务创业计划书
2014/01/30 职场文书
摄影助理岗位职责
2014/02/07 职场文书
高中竞选班长演讲稿
2014/04/24 职场文书
大学班级计划书
2014/04/29 职场文书
贫困证明书格式及范文
2014/10/15 职场文书
个人欠款协议书范本2014
2014/11/02 职场文书
小学教师个人工作总结2015
2015/04/20 职场文书
2015年公路养护工作总结
2015/05/13 职场文书
Vue Mint UI mt-swipe的使用方式
2022/06/05 Vue.js
Android开发EditText禁止输入监听及InputFilter字符过滤
2022/06/10 Java/Android