Python之池化

在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

但再看下面这个例子,在字符串中间插入一个空格后,虽然ab还是相同的值,但是内存地址却是不一样的:

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

你可能感兴趣的:(Python之池化)