Python进阶编程:编写更高效、优雅的Python代码
上QQ阅读APP看书,第一时间看更新

2.1.1 字符串对象的intern机制

在Python中,字符串是最简单也是最常用的数据类型之一。在CPython中,字符串的实现使用了一种叫作intern(字符串驻留)的技术来提高字符串效率,源码示例如下:


>>> s3 = "hello!"
>>> s4 = "hello!"
>>> s3 is s4
False
>>> id(s3)
4404580528
>>> id(s4)
4404130288

源码示例中,虽然s3和s4值是一样的,但它们确确实实是两个不同的字符串对象,Python会为它们各自分配一段内存空间,如图2-1所示。

图2-1 字符串内存占用示例

假设程序中存在大量值相同的字符串,系统就不得不为每个字符串重复地分配内存空间,这对系统来说是一种资源浪费。为了解决这种问题,Python引入了intern()函数,源码示例如下:


>>> import sys
>>> s3 = sys.intern('hello!')
>>> s4 = sys.intern('hello!')
>>> s3 is s4
True
>>> id(s3)
4472499504
>>> id(s4)
4472499504

上述示例中,s3和s4经intern()函数处理后,对象指向如图2-2所示。

图2-2 intern()函数处理示例

intern()是Python中sys模块中的一个函数,该函数的作用是对字符串进行处理,处理后返回字符串对象。

凡是值相同的字符串经过intern()函数处理之后,返回的都是同一个字符串对象,这种方式在处理大量数据的时候无疑能节省更多的内存空间。系统无须为相同的字符串重复分配内存,而是值相同的字符串共用一个对象即可。

实现intern()函数非常简单,就是通过维护一个字符串储蓄池,这个池子是一个字典结构。如果字符串已经存在于字符串储蓄池,系统就不再去创建新的字符串,直接返回之前创建好的字符串对象;如果字符串还没有加入字符串储蓄池,系统则先构造一个字符串对象,并把这个对象加入字符串储蓄池,便于下次获取。

在面向对象的主流编程语言中,intern()函数对于处理字符串已经成为一种标配,可以提高字符串的处理效率。