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的装饰器使用详解
Jun 26 Python
python编写分类决策树的代码
Dec 21 Python
Django组件之cookie与session的使用方法
Jan 10 Python
详解python tkinter教程-事件绑定
Mar 28 Python
详解python项目实战:模拟登陆CSDN
Apr 04 Python
DataFrame 数据合并实现(merge,join,concat)
Jun 14 Python
Python 爬虫性能相关总结
Aug 03 Python
python开根号实例讲解
Aug 30 Python
Python使用cn2an实现中文数字与阿拉伯数字的相互转换
Mar 02 Python
使用Python webdriver图书馆抢座自动预约的正确方法
Mar 04 Python
python控制台打印log输出重复的解决方法
May 14 Python
Python matplotlib可视化之绘制韦恩图
Feb 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
ThinkPHP中__initialize()和类的构造函数__construct()用法分析
2014/11/29 PHP
php树型类实例
2014/12/05 PHP
php实现数组按指定KEY排序的方法
2015/03/30 PHP
PHP扩展安装方法步骤解析
2020/11/24 PHP
Firefox中beforeunload事件的实现缺陷浅析
2012/05/03 Javascript
jquery简单瀑布流实现原理及ie8下测试代码
2013/01/23 Javascript
JavaScript中的prototype.bind()方法介绍
2014/04/04 Javascript
Jquery Ajax方法传值到action的方法
2014/05/11 Javascript
JavaScript代码编写中各种各样的坑和填坑方法
2014/06/06 Javascript
jquery操作checkbox示例分享
2014/07/21 Javascript
SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
2015/12/10 Javascript
深入理解Node中的buffer模块
2017/06/03 Javascript
js监听html页面的上下滚动事件方法
2018/09/11 Javascript
node express使用HTML模板的方法示例
2019/08/22 Javascript
Vue.js如何使用Socket.IO的示例代码
2019/09/05 Javascript
原生js实现自定义滚动条
2021/01/20 Javascript
Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
2018/02/23 Python
python MySQLdb使用教程详解
2018/03/20 Python
解决tensorflow测试模型时NotFoundError错误的问题
2018/07/27 Python
解决nohup执行python程序log文件写入不及时的问题
2019/01/14 Python
python实现大学人员管理系统
2019/10/25 Python
详解Scrapy Redis入门实战
2020/11/18 Python
CSS实现鼠标滑过鼠标点击代码写法
2016/12/26 HTML / CSS
基于CSS3实现的几个小loading效果
2018/09/27 HTML / CSS
Eyeko美国:屡获殊荣的睫毛膏、眼线笔和眉妆
2018/07/05 全球购物
行政助理的职责
2013/11/14 职场文书
大二学期个人自我评价
2014/01/13 职场文书
运动会广播稿50字
2014/01/26 职场文书
社区母亲节活动记录
2014/03/06 职场文书
党员领导干部民主生活会批评与自我批评发言
2014/09/28 职场文书
2014年领导班子专项整治整改方案
2014/09/28 职场文书
2014镇党委书记党建工作汇报材料
2014/11/02 职场文书
乒乓球比赛通知
2015/04/27 职场文书
导游词之平津战役纪念馆
2019/11/04 职场文书
代码复现python目标检测yolo3详解预测
2022/05/06 Python
TaiShan 200服务器安装Ubuntu 18.04的图文教程
2022/06/28 Servers