Python 字符串池化的前提
前言
在Python中经常通过内存池化技术来提高其性能,那么问题来了,在什么情况下会池化呢?让我们通过几个例子进行一下理解一下.
预备知识
在查看例子之前,首先要提python中的一个函数id(),让我们看一下函数说明:
id(obj,/) Returntheidentityofanobject. Thisisguaranteedtobeuniqueamongsimultaneouslyexistingobjects. (CPythonusestheobject\'smemoryaddress.)
通过上述说明,可以得知id()将会返回对像的唯一标识,在CPython中将会返回内存地址,也就是说如果两个对象的id值一样,可以说着两个对象是相同的了.
例子
example00
a="" b="" print(id(a),id(b)) print(aisb)
输出结果:
>>>a=""
>>>b=""
>>>print(id(a),id(b))
21148533705442114853370544
>>>print(aisb)
True
example01
a="a" b="a" print(id(a),id(b)) print(aisb)
输出结果:
>>>a="a"
>>>b="a"
>>>print(id(a),id(b))
21148830226082114883022608
>>>print(aisb)
True
example02
a="magic_string" b="magic"+"_"+"string" print(id(a),id(b)) print(aisb)
输出结果:
>>>a="magic_string"
>>>b="magic"+"_"+"string"
>>>print(id(a),id(b))
21148871611362114887161136
>>>print(aisb)
True
example03
a="magic!" b="mgaic!" print(id(a),id(b)) print(aisb)
输出结果:
>>>a="magic!"
>>>b="mgaic!"
>>>print(id(a),id(b))
21148858554162114889455408
>>>print(aisb)
False
example04
a,b="magic!","magic!" print(id(a),id(b)) print(aisb)
输出结果:
>>>a,b="magic!","magic!"
>>>print(id(a),id(b))
21148856919122114885691912
>>>print(aisb)
True
example05
a="!" b="!" print(id(a),id(b)) print(aisb)
输出结果:
>>>a="!"
>>>b="!"
>>>print(id(a),id(b))
140564571922024140564571922024
>>>print(aisb)
True
example06
print(a*20is'aaaaaaaaaaaaaaaaaaaa') print(a*21is'aaaaaaaaaaaaaaaaaaaaa')
输出结果:
>>>print(a*20is'aaaaaaaaaaaaaaaaaaaa')
False
>>>print(a*21is'aaaaaaaaaaaaaaaaaaaaa')
False
总结
通过上述7个例子,我们不难对python的字符串池化有个大概的认识,我们这里做个简单的总结:
- 通过example00,01,05,我们可以得出对于长度为0或者1的字符串会被池化
- 通过example02,03,我们可以得出字符串中只包含字母数字以及下划线的字符串会被池化
- 通过example04,我们可以得出当在同一行对不同变量,赋值如果相同的话,它们将会指向同一个对象,注意这里面的“magic!”并不符合池化的要求,这只是一种编译器的优化
- example06所出现的现象在python中有一个专业的术语,讲常量折叠(constantfolding),顾名思义,在编译优化时,讲能够计算出的结果的变量直接替换为常量.但是这没有限制吗?显然不是的,在我们的例子中已经发现,当长度超过20的时候,折叠就会失效了,试想一下,如果没有限制的话,初始化的字符串过长,将会严重导致性能的下降以及内存的消耗
参考链接
TheinternalsofPythonstringinterning
exploringpythoncodeobjects
Pythonstringinterning
PythonStringobjectsimplementation
以上就是Python字符串池化的前提的详细内容,更多关于Python字符串池化的资料请关注毛票票其它相关文章!