Python对象 —— String对象
Python中的字符串对象
PyStringObject 与 PyString_Type
- Python的字符串类型对象是
PyStringObject,字符串创建的实例是PyString_Type PyStringObject设置了字符串对象的长度、存储地址和获取hashPyStringObject内引用了PyObject_VAR_HEAD,它内部定义了字符串对象的长度- 字符串通过hash来获取值,未经过hash的字符串的hash为1
创建PyStringObject对象
- Python创建字符串的方法从C原生的字符串创建PyStringObject对象:
- 方法1:
PyString_FromString- 判断字符串长度,如果超过了最大长度就不会创建
- Python将空字符串制定到一个专门的空字符串类`null strings,判断字符串的长度,如果是空字符串就如上
- 创建对象
- 为字符串对象申请内存
![]()
- 方法2:
PyString_FromStringAndSize
- 方法1:
- 两种方法的区别
PyString_FromString传入的参数必须是以NUL('\0')结尾的字符数组的指针PyString_FromStringAndSize不需要,可以通过传入的size参数确认需要的内存空间大小
字符串对象的intern机制
- 字符串通过intern机制防止同一个值的字符串被反复创建
- intern通过一个dict来存储和快速查找已创建的字符串,字符串通过引用计数控制
- intern机制在创建字符串对象后进行
- intern机制的关键是系统中有一个存储所有被intern处理过的pystringobject对象的集合interned
![]()
方法:PyString_InternInPlace
- 方法只能创建SSTATE_INTERNED_IMMORTAL状态的字符串,他们会在python程序结束后删除
字符缓冲池
- 字符串对象存储对象池characters,这个对象池初始状态为空,在字符串对象被创建后,经过intern的字符串会存储对象池
PyStringObject效率相关问题
在Python中最好不要使用"+"来合并字符串,因为这样合并时必然会创建一个新的PyStringObject对象,也就必然会进行内存搬运,影响性能,建议使用join方法
在执行join时,会先统计列表内所有的PyStringObject对象,统一申请内存
本文来自博客园,作者:lwxc,转载请注明原文链接:https://www.cnblogs.com/mars-zhz/articles/17555442.html


浙公网安备 33010602011771号