Python 字符串池化的前提

 更新时间:2020年07月03日 15:59:11   作者:Leetao  
这篇文章主要介绍了Python 字符串池化的前提,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下

前言

在 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 删除连续出现的指定字符的实例

    今天小编就为大家分享一篇Python 删除连续出现的指定字符的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • python实现将pvr格式转换成pvr.ccz的方法

    python实现将pvr格式转换成pvr.ccz的方法

    这篇文章主要介绍了python实现将pvr格式转换成pvr.ccz的方法,涉及Python实现格式转换的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • 基于pandas将类别属性转化为数值属性的方法

    基于pandas将类别属性转化为数值属性的方法

    今天小编就为大家分享一篇基于pandas将类别属性转化为数值属性的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • python中web框架的自定义创建

    python中web框架的自定义创建

    这篇文章主要为大家详细介绍了python中web框架的自定义创建,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • python如何向一个dataframe中新加一行

    python如何向一个dataframe中新加一行

    这篇文章主要介绍了python如何向一个dataframe中新加一行问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Python 使用pandas实现查询和统计示例详解

    Python 使用pandas实现查询和统计示例详解

    这篇文章主要为大家介绍了Python 使用pandas实现查询和统计示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • python的flask框架难学吗

    python的flask框架难学吗

    在本篇内容中小编给大家分享了关于python的flask框架是否难学的相关知识点,有兴趣的朋友们阅读下吧。
    2020-07-07
  • Python调用百度api实现语音识别详解

    Python调用百度api实现语音识别详解

    这篇文章主要介绍了Python通过调用百度api实现语音识别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2021-12-12
  • Flask框架模板继承实现方法分析

    Flask框架模板继承实现方法分析

    这篇文章主要介绍了Flask框架模板继承实现方法,结合实例形式分析了模板继承的应用场景及flask实现模板继承的相关操作技巧,需要的朋友可以参考下
    2019-07-07
  • pytest解读fixture有效性及跨文件共享fixtures

    pytest解读fixture有效性及跨文件共享fixtures

    这篇文章主要为大家介绍了pytest官方文档fixture有效性及跨文件共享fixtures的解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06

最新评论