上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()函数对于处理字符串已经成为一种标配,可以提高字符串的处理效率。