1.字符缓冲池
Python也为PyStringObject中的一个字节的的字符对应的PyStringObject对象也设计了一个对象池,
static PyStringObject *characters[UCHAR_MAX+1]
其中的UCHAR_MAX是系统头文件定义的常量。
当我们创建一个PyStringObject对象时,无论是通过调用PyString_FromString还是通过调用PyString_FromStringAndSize,如果字符串实际是一个字符,则会进行如下操作,
2.PyStringObject效率相关问题
假如现在有两个字符串“Python”和“Ruby”,在java中可以通过使用 "+“操作符将两个字符串连接在一起,当然Python也提供了利用
“+”操作符链接字符串的功能,然而通过这样的方法效率低下,根源在于PyStringObject对象是一个不可变对象,这意味着当字符串进行连接时,会产生一个新的PyStringObject,如果要连接N个对象,就必须进行N-1次内存申请及搬运操作。
官方推荐的方法是利用PyStringObject对象的join操作来对存储在list或tuple的一组PyStringObject对象进行连接操作。这种方法只需分配一次内存。
关于 join 和 ”+“操作符的源码就不贴出了,省略了比较多的内容,有兴趣的可以自己去翻阅python 源码。