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 模拟员工信息数据库操作的实例
Oct 23 Python
python编写弹球游戏的实现代码
Mar 12 Python
Python3实现将本地JSON大数据文件写入MySQL数据库的方法
Jun 13 Python
python 实现视频流下载保存MP4的方法
Jan 09 Python
numpy.where() 用法详解
May 27 Python
python2和python3实现在图片上加汉字的方法
Aug 22 Python
ubuntu上安装python的实例方法
Sep 30 Python
python3 实现函数写文件路径的正确方法
Nov 27 Python
Python:合并两个numpy矩阵的实现
Dec 02 Python
numpy的Fancy Indexing和array比较详解
Jun 11 Python
Python 中数组和数字相乘时的注意事项说明
May 10 Python
只需要这一行代码就能让python计算速度提高十倍
May 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
《破坏领主》销量已超100万 未来将继续开发新内容
2020/03/08 其他游戏
在PHP3中实现SESSION的功能(一)
2006/10/09 PHP
PHP模板引擎Smarty内建函数section,sectionelse用法详解
2016/04/11 PHP
php文件上传后端处理小技巧
2016/05/22 PHP
PHP基于SimpleXML生成和解析xml的方法示例
2017/07/17 PHP
PhpStorm 2020.3:新增开箱即用的PHP 8属性(推荐)
2020/10/30 PHP
jquery 可排列的表实现代码
2009/11/13 Javascript
jQuery对象[0]是什么含义?
2010/07/31 Javascript
JavaScript实现点击按钮直接打印
2016/01/06 Javascript
微信小程序开发之圆形菜单 仿建行圆形菜单实例
2016/12/12 Javascript
JavaScript制作简单的框选图表
2017/05/15 Javascript
详解最新vue-cli 2.9.1的webpack存在问题
2017/12/16 Javascript
浅谈Vue.use到底是什么鬼
2020/01/21 Javascript
解决vue-router 嵌套路由没反应的问题
2020/09/22 Javascript
基于vue实现微博三方登录流程解析
2020/11/04 Javascript
[05:35]DOTA2英雄梦之声_第13期_拉比克
2014/06/21 DOTA
[44:01]2018DOTA2亚洲邀请赛3月30日 小组赛B组 EG VS paiN
2018/03/31 DOTA
简单的Python抓taobao图片爬虫
2014/10/26 Python
Python使用multiprocessing创建进程的方法
2015/06/04 Python
Python rstrip()方法实例详解
2018/11/11 Python
python读取目录下所有的jpg文件,并显示第一张图片的示例
2019/06/13 Python
Pytorch 抽取vgg各层并进行定制化处理的方法
2019/08/20 Python
Python获取时间戳代码实例
2019/09/24 Python
OpenCV+Python--RGB转HSI的实现
2019/11/27 Python
Python爬虫实例——scrapy框架爬取拉勾网招聘信息
2020/07/14 Python
python爬虫中url管理器去重操作实例
2020/11/30 Python
Python爬虫实战案例之爬取喜马拉雅音频数据详解
2020/12/07 Python
捷克领先的户外服装及配件市场零售商:ALPINE PRO
2018/01/09 全球购物
廉价航班、机票和酒店:JustFly
2018/02/07 全球购物
Bailey帽子官方商店:Bailey Hats
2018/09/25 全球购物
文员个人的求职信范文
2013/09/26 职场文书
自荐书模板
2013/12/19 职场文书
会计学生自我鉴定
2014/02/06 职场文书
卫生院艾滋病宣传活动总结
2015/05/09 职场文书
教你怎么用python selenium实现自动化测试
2021/05/27 Python
浅谈MySQL表空间回收的正确姿势
2021/10/05 MySQL