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读取图片EXIF信息类库介绍和使用实例
Jul 10 Python
Python3.2中的字符串函数学习总结
Apr 23 Python
初步讲解Python中的元组概念
May 21 Python
Python删除空文件和空文件夹的方法
Jul 14 Python
Python中的浮点数原理与运算分析
Oct 12 Python
python实现决策树ID3算法的示例代码
May 30 Python
对python中array.sum(axis=?)的用法介绍
Jun 28 Python
Python实现手写一个类似django的web框架示例
Jul 20 Python
python使用magic模块进行文件类型识别方法
Dec 08 Python
使用matplotlib绘制图例标签中带有公式的图
Dec 13 Python
Numpy之reshape()使用详解
Dec 26 Python
python和php哪个容易学
Jun 19 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
实现获取http内容的php函数分享
2014/02/16 PHP
PHP.ini中配置屏蔽错误信息显示和保存错误日志的例子
2014/05/12 PHP
PHP中使用CURL模拟登录并获取数据实例
2014/07/01 PHP
php+mysqli使用面向对象方式查询数据库实例
2015/01/29 PHP
关于php中一些字符串总结
2016/05/05 PHP
PHP使用OB缓存实现静态化功能示例
2019/03/23 PHP
js下通过getList函数实现分页效果的代码
2010/09/17 Javascript
jQuery布局插件UI Layout简介及使用方法
2013/04/03 Javascript
Javascript学习笔记之 对象篇(一) : 对象的使用和属性
2014/06/24 Javascript
分享20款美化网站的 jQuery Lightbox 灯箱插件
2014/10/10 Javascript
基于jQuery实现的文字按钮表单特效整理
2014/12/07 Javascript
Node.js文件操作方法汇总
2016/03/22 Javascript
jQuery实现图片滑动效果
2017/03/08 Javascript
js实现下拉框效果(select)
2017/03/28 Javascript
vue.js input框之间赋值方法
2018/08/24 Javascript
Angular2实现的秒表及改良版示例
2019/05/10 Javascript
8 个有用的JS技巧(推荐)
2019/07/03 Javascript
vue项目中自定义video视频控制条的实现代码
2020/04/26 Javascript
[04:19]DOTA2完美大师赛第四天精彩集锦
2017/11/26 DOTA
[40:19]2018完美盛典CS.GO表演赛
2018/12/17 DOTA
Python中使用scapy模拟数据包实现arp攻击、dns放大攻击例子
2014/10/23 Python
Python爬虫beautifulsoup4常用的解析方法总结
2019/02/25 Python
opencv3/C++ 平面对象识别&透视变换方式
2019/12/11 Python
python实现飞船大战
2020/04/24 Python
Pytorch实现将模型的所有参数的梯度清0
2020/06/24 Python
Python3+RIDE+RobotFramework自动化测试框架搭建过程详解
2020/09/23 Python
python在地图上画比例的实例详解
2020/11/13 Python
欧洲最大的球衣网上商店:Kitbag
2017/11/11 全球购物
Belstaff英国官方在线商店:Belstaff.co.uk
2021/02/09 全球购物
兼职业务员岗位职责
2014/01/01 职场文书
写给妈妈的道歉信
2014/01/11 职场文书
职业培训师职业生涯规划
2014/02/18 职场文书
大学生两会学习心得体会
2014/03/10 职场文书
领导接待方案
2014/03/13 职场文书
公司保密管理制度
2015/08/04 职场文书
创业计划书之物流运送
2019/09/17 职场文书