在Python的实现里广泛使用了内存池技术来提高性能,一些相同且无特殊意义的对象也常被池化,减少了对象数量以及内存占用。
举其中一个例子,有A,B,C三个类,其中只有C定义了文档字符串,这时候用A.__doc__ is B.__doc__
就能发现,它们使用的内存地址是一样的,说明类的__doc__
属性默认都被池化了,而再执行A.__doc__ is C.__doc__
就会看到结果是False
,说明只有定义了doc-string
的时候,__doc__
属性才会被分配新的内存。
class A: pass
class B: pass
class C:
'''doc-string'''
pass
A is B
# False
A.__doc__ is B.__doc__
# True
A.__doc__ is C.__doc__
# False
对于简单字符串,Python会将其放进内存池中,当字符串的引用变为0时,再把它的内存释放。
a = 'HelloWorld'
b = 'HelloWorld'
a is b
# True
但再看下面这个例子,在字符串中间插入一个空格后,虽然a
和b
还是相同的值,但是内存地址却是不一样的:
a = 'Hello World'
b = 'Hello World'
a is b
# False
a = ' '
b = ' '
a is b
# True
这是因为Python认为的简单字符串一般只包含字母或数字,因此对于这种带有额外字符的字符串,Python是不会将其池化的。
a = '汉字'
b = '汉字'
a is b
# False
在Python 3.x中,可以用sys
模块的intern
方法来给程序运行期间动态生成的字符串池化。
import sys
a = '汉字'
b = '汉字'
a = sys.intern(a)
b = sys.intern(b)
a is b
# True
网友评论