- reference: Python 源码剖析
- Python_string_object
- PyStringObject与PyString_Type
- 创建PyStringObject对象
- 字符串对象的intern机制
- 字符缓冲池
- PyStringObject效率相关问题
- Hack PyStringObject
1.Python中的字符串对象(变长对象中的不可变对象)
a.PyStringObject与PyString_Type
1 | [stringobject.h] |
1 | /* hash值算法 */ |
1 | [stringobject.c] |
b.创建PyStringObject对象
- 从PyString_FromString创建
1 | [stringobject.c] |
- 从PyString_FromStringAndSize创建
1 | [stringobject.c] |
c.字符串对象的intern机制
当字符串长度为0或1时,需要进行PyString_InternInPlace,这就是intern机制
1 | [stringobject.c] |
被intern之后的字符串,在整个Python的运行期间,系统中都只有唯一一个与字符串对应的PyStringObject对象
1 | /* intern */ |
1 | [stringobject.c] |
1 | /* 创建SSTATE_INTERNED_IMMORTAL对象 */ |
d.字符缓冲池
- 为PyStringObject中的一个字节的字符对应的PyStringObject对象设计了一个对象池characters
1 | static PyStringObject* characters[UCHAR_MAX + 1]; // UCHAR_MAX是一个平台相关的常量 |
1 | /* 如果字符串只有一个字符 */ |
e.PyStringObject效率相关问题
- 字符串连接
Python中”+”进行字符串连接效率非常低下,因为PyStringObject对象是一个不可变对象,每次连接需要创建新的PyStringObject对象
通过利用PyStringObject的join操作来对操作,只分配一次内存,效率大大提高
1 | /* 通过“+”操作符对字符串进行连接 */ |
1 | /* 通过“join”操作符对字符串进行连接 */ |