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中os和shutil模块实用方法集锦
May 13 Python
总结Python编程中三条常用的技巧
May 11 Python
Python判断值是否在list或set中的性能对比分析
Apr 16 Python
Python实现的简单dns查询功能示例
May 24 Python
Django实现组合搜索的方法示例
Jan 23 Python
python tkinter实现界面切换的示例代码
Jun 14 Python
cProfile Python性能分析工具使用详解
Jul 22 Python
详解python pandas 分组统计的方法
Jul 30 Python
pycharm软件实现设置自动保存操作
Jun 08 Python
可视化pytorch 模型中不同BN层的running mean曲线实例
Jun 24 Python
pytorch 中forward 的用法与解释说明
Feb 26 Python
python opencv人脸识别考勤系统的完整源码
Apr 26 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
PHP实现多服务器session共享之NFS共享的方法
2007/03/16 PHP
window.navigate 与 window.location.href 的使用区别介绍
2013/09/21 Javascript
javascript获取select的当前值示例代码(兼容IE/Firefox/Opera/Chrome)
2013/12/17 Javascript
Javascript Memoizer浅析
2014/10/16 Javascript
Javascript基础教程之函数对象和属性
2015/01/18 Javascript
15款jQuery分布引导插件分享
2015/02/04 Javascript
jQuery实现textarea自动增长宽高的方法
2015/12/18 Javascript
java中String类型变量的赋值问题介绍
2016/03/23 Javascript
angularjs 表单密码验证自定义指令实现代码
2016/10/27 Javascript
jQuery插件HighCharts实现气泡图效果示例【附demo源码】
2017/03/13 Javascript
react 父组件与子组件之间的值传递的方法
2017/09/14 Javascript
JavaScript html5 canvas实现图片上画超链接
2017/10/20 Javascript
微信小程序实现的canvas合成图片功能示例
2019/05/03 Javascript
JS运算符简单用法示例
2020/01/19 Javascript
VSCode launch.json配置详细教程
2020/06/18 Javascript
python实现猜数字游戏(无重复数字)示例分享
2014/03/29 Python
python新手经常遇到的17个错误分析
2014/07/30 Python
Python的网络编程库Gevent的安装及使用技巧
2016/06/24 Python
详解MySQL数据类型int(M)中M的含义
2016/11/20 Python
Python实现并行抓取整站40万条房价数据(可更换抓取城市)
2016/12/14 Python
Python中int()函数的用法浅析
2017/10/17 Python
Python实现去除图片中指定颜色的像素功能示例
2019/04/13 Python
Python 中 sorted 如何自定义比较逻辑
2021/02/02 Python
HTML5的video标签的浏览器兼容性增强方案分享
2016/05/19 HTML / CSS
WINDOWS域的具体实现方式是什么
2014/02/20 面试题
酒店服务与管理毕业生求职信
2013/11/02 职场文书
医院护士的求职信范文
2013/12/26 职场文书
幼儿园教师请假制度
2014/01/16 职场文书
乡镇网格化管理实施方案
2014/03/23 职场文书
QQ空间主人寄语大全
2014/04/12 职场文书
居委会工作总结2015
2015/05/18 职场文书
2016大学迎新晚会开场白
2015/11/24 职场文书
告别网页搜索!教你用python实现一款属于自己的翻译词典软件
2021/06/03 Python
python中使用 unittest.TestCase单元测试的用例详解
2021/08/30 Python
Python中super().__init__()测试以及理解
2021/12/06 Python
Java实现HTML转为Word的示例代码
2022/06/28 Java/Android