什么是string interning(字符串驻留)以及python中字符串的intern机制

Incomputer science, string interning is a method of storing only onecopy of each distinct string value, which must be immutable.
Interning strings makes some stringprocessing tasks more time- or space-efficient at the cost of requiring moretime when the string is created or interned. The distinct values are stored ina string intern pool. --引自维基百科

也就是说,值相同的字符串对象只会保存一份,是共用的,这也决定了字符串必须是不可变对象。想一想,就跟数值类型一样,相同的数值只要保存一份就行了,没必要用不同对象来区分。

python中的字符串采用了intern机制,会自动intern。

>>a = ‘kzc‘

>>b = ‘k‘+‘zc‘

>>id(a)

55704656

>>id(b)

55704656

可以看到,它们是同一个对象。

intern机制的好处是,需要值相同的字符串的时候(比如标识符),直接从池里拿来用,避免频繁的创建和销毁,提升效率,节约内存。缺点是,拼接字符串、对字符串修改之类的影响性能。因为是不可变的,所以对字符串修改不是inplace操作,要新建对象。这也是为什么拼接多字符串的时候不建议用+而用join()。join()是先计算出所有字符串的长度,然后一一拷贝,只new一次对象。

需要小心的,并不是所有的字符串都会采用intern机制。只包含下划线、数字、字母的字符串才会被intern。

>>a = ‘hello world‘

>>b = ‘hello world‘

>>id(a)

56400384

>>id(b)

56398336

这里因为有空格,所有没被intern。

但是为什么这么做呢?既然python内置函数intern()能显式对任意字符串进行intern。说明不是实现难度的问题。

答案在源码stringobject.h中的注释可以找到,

/* ... ... This is generally restricted tostrings that "looklike" Python identifiers, although the intern() builtincan be used to force interning of any string ... ... */

也就是说,只对那些看起来像是python标识符的进行intern。

下面看另外一个

例1.

>>‘kz‘+‘c‘ is ‘kzc‘

True

例2.

>>s1 = ‘kz‘

>>s2 = ‘kzc‘

>>s1+‘c‘ is ‘kzc‘

False

为什么第二个栗子是False,只包含字母啊,不是应该被自动intern的么?

这是因为第一个栗子中,‘kz‘+‘c‘是在compile time求值的,被替换成了‘kzc‘.

而第二个栗子,s1+‘c‘是在run-time拼接的,导致没有被自动intern.

时间: 2024-08-03 16:56:44

什么是string interning(字符串驻留)以及python中字符串的intern机制的相关文章

python中字符串链接的七种方式

一. str1+str2 string类型 '+'号连接 >>> str1="one" >>> str2="two" >>> str1+str2 'onetwo' >>>注意:该方式性能较差,因为python中字符串是不可变的类型,使用 + 连接两个字符串时会生成一个新的字符串,生成新的字符串就需要重新申请内存,当连续相加的字符串很多时(a+b+c+d+e+f+...) ,效率低下就是必然的了例

Python中字符串查找效率比较

Python中字符串查找方式有多种,常见的有re.match/search or str.find 用一个例子来说明各种方式的效率如下: from timeit import timeit import re def find(string, text): if string.find(text) > -1: pass def re_find(string, text): if re.match(text, string): pass def best_find(string, text): i

Python中字符串的使用

这篇文章主要介绍python当中用的非常多的一种内置类型——str.它属于python中的Sequnce Type(序列类型).python中一共7种序列类型,分别为str(字符串),unicode(u字符串),list(列表),tuple(元组),bytearray(字节数组),buffer(缓冲内存),xrange(范围).它们的通用操作如下: Operation Result x in s 判断x是否在s中 x not in s 判断x是不在s中 x + t 两个序列合并, 将t加到s之后

Python中字符串的操作

在python中字符串的包围的引号有三种,单引号,双引号,三引号,其中,单引号和双引号完全相同,在python中单引号也可完成转义工作 >>>print('doesn\'t \n it?') doesn't it? 但经常性的,一般使用 单双引号+转义更为普遍 >>>print("doesn't \n it?") doesn't  it? 三引号的使用,三引号(三个单引号或者三个双引号)用来座位注释,文档说明,类描述,用于比较广泛,他可以包含单引号,

python中字符串的操作方法

python中字符串的操作方法大全 更新时间:2018年06月03日 10:08:51 作者:骏马金龙 我要评论这篇文章主要给大家介绍了关于python中字符串操作方法的相关资料,文中通过示例代码详细介绍了关于python中字符串的大小写转换.isXXX判断.填充.子串搜索.替换.分割.join以及修剪:strip.lstrip和rstrip的相关内容,需要的朋友可以参考下 前言 python中字符串对象提供了很多方法来操作字符串,功能相当丰富.?123 print(dir(str)) [...

python中字符串的几种表达方式(用什么方式表示字符串)

说明: 今天在学习python的基础的内容,学习在python中如何操作字符串,在此记录下. 主要是python中字符串的几种表达,表示方式. python的几种表达方式 1 使用单引号扩起来字符串 >>> 'my python lession' #以单引号将字符串扩起来 'my python lession' >>> a = 'my python lession' >>> print(a) my python lession 2 使用双引号将字符串扩

Python中字符串的有趣玩法

反转一个字符串 >>> S = 'abcdefghijklmnop' >>> S[::-1] 'ponmlkjihgfedcba' 这种用法叫做three-limit slices 除此之外,还可以使用slice对象,例如 >>> 'spam'[slice(None, None, -1)] >>> unicode码与字符(single-character strings)之间的转换 >>> ord('s') # or

python中字符串拼接

python中字符串拼接的三种方式: 1.使用 '+': 这中方式会在内存中,没使用一次就开辟一个新的空间,不建议使用.当数据庞大时候效率很低.后期有垃圾回收机制来处理没有用的字符串 案例:name = 'jam' name1 = name + 'c'这样内存中会开辟一个空间存放 name2 = name1 + 'h''这样内存中会再开辟一个空间存放 2.字符串格式化的形式:%s,这中方式让内存最多就开辟两个空间来进行存放字符. 案例:name = 'jam' name2 = 'chen' se

Python中字符串的表示

区别于其他语言,python中字符串可以用3中方法表示,且都能被正确编译: 1.'mary' 单引号括起来 2."it's a great day" 双引号括起来 3.''' nice to meet you, my dear friend. '''   三引号括起来 区别: a.单引号和双引号没有什么区别,不过单引号不用按shift,打字稍微快一点.表示字符串的时候,单引号里面可以用双引号,而不用转义字符,反之亦然. b.如果直接用单引号括住单引号,需要转义字符,像这样:'it\'s