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发送邮件接收邮件示例分享
Jan 21 Python
python在windows和linux下获得本机本地ip地址方法小结
Mar 20 Python
在Python中使用NLTK库实现对词干的提取的教程
Apr 08 Python
Python中read()、readline()和readlines()三者间的区别和用法
Jul 30 Python
python文件名和文件路径操作实例
Sep 29 Python
Python字符串对象实现原理详解
Jul 01 Python
python多线程分块读取文件
Aug 29 Python
新手学习Python2和Python3中print不同的用法
Jun 09 Python
python 删除excel表格重复行,数据预处理操作
Jul 06 Python
Python 实现图片转字符画的示例(静态图片,gif皆可)
Nov 05 Python
python连接手机自动搜集蚂蚁森林能量的实现代码
Feb 24 Python
python机器学习创建基于规则聊天机器人过程示例详解
Nov 02 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中输出转义JavaScript代码的实现代码
2011/04/22 PHP
php中判断字符串是否全是中文或含有中文的实现代码
2011/09/16 PHP
PHP实现的微信APP支付功能示例【基于TP5框架】
2019/09/16 PHP
用javascript实现页面打印的三种方法
2007/03/05 Javascript
模拟用户操作Input元素,不会触发相应事件
2007/05/11 Javascript
jQuery帮助之CSS尺寸(五)outerHeight、outerWidth
2009/11/14 Javascript
使用JavaScript 实现各种跨域的方法
2013/05/08 Javascript
用Javascript获取页面元素的具体位置
2013/12/09 Javascript
javascript动态设置样式style实例分析
2015/05/13 Javascript
jQuery三级下拉列表导航菜单代码分享
2020/04/15 Javascript
jquery实现可旋转可拖拽的文字效果代码
2016/01/27 Javascript
ionic js 复选框 与普通的 HTML 复选框到底有没区别
2016/06/06 Javascript
Vue获取DOM元素样式和样式更改示例
2017/03/07 Javascript
jquery.flot.js简单绘制折线图用法示例
2017/03/13 Javascript
javascript中的隐式调用
2018/02/10 Javascript
解决Angular4项目部署到服务器上刷新404的问题
2018/08/31 Javascript
Javascript中绑定click事件的四种方式介绍
2018/10/26 Javascript
Vue2.x通用编辑组件的封装及应用详解
2019/05/28 Javascript
解决新建一个vue项目过程中遇到的问题
2020/10/22 Javascript
用map函数来完成Python并行任务的简单示例
2015/04/02 Python
Python基于PycURL实现POST的方法
2015/07/25 Python
Python中Iterator迭代器的使用杂谈
2016/06/20 Python
Python 爬虫模拟登陆知乎
2016/09/23 Python
Python安装官方whl包和tar.gz包的方法(推荐)
2017/06/04 Python
python实现多进程代码示例
2018/10/31 Python
使用urllib库的urlretrieve()方法下载网络文件到本地的方法
2018/12/19 Python
python 读取竖线分隔符的文本方法
2018/12/20 Python
彻底搞懂 python 中文乱码问题(深入分析)
2020/02/28 Python
如何用Python 实现全连接神经网络(Multi-layer Perceptron)
2020/10/15 Python
Python经典五人分鱼实例讲解
2021/01/04 Python
HTML5实现的图片无限加载的瀑布流效果另带边框圆角阴影
2014/03/07 HTML / CSS
Veronica Beard官网:在酷、经典和别致之间找到了平衡
2018/01/11 全球购物
汇科协同Java笔试题
2012/03/31 面试题
幼儿园教师备课制度
2014/01/12 职场文书
《在大海中永生》教学反思
2014/02/24 职场文书
社区科普工作方案
2014/06/03 职场文书