温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Python在什么情况下字符串会池化

发布时间:2020-07-06 11:28:12 来源:亿速云 阅读:105 作者:清晨 栏目:开发技术

小编给大家分享一下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的时候,折叠就会失效了,试想一下,如果没有限制的话,初始化的字符串过长,将会严重导致性能的下降以及内存的消耗。
    看完了这篇文章,相信你对Python 字符串池化的前提有了一定的了解,想了解更多相关知识,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI