Python对象 —— String对象

Python中的字符串对象

PyStringObject 与 PyString_Type

  • Python的字符串类型对象是PyStringObject,字符串创建的实例是PyString_Type
  • PyStringObject设置了字符串对象的长度、存储地址和获取hash
  • PyStringObject内引用了PyObject_VAR_HEAD,它内部定义了字符串对象的长度
  • 字符串通过hash来获取值,未经过hash的字符串的hash为1

创建PyStringObject对象

  • Python创建字符串的方法从C原生的字符串创建PyStringObject对象:
    1. 方法1:PyString_FromString
      1. 判断字符串长度,如果超过了最大长度就不会创建
      2. Python将空字符串制定到一个专门的空字符串类`null strings,判断字符串的长度,如果是空字符串就如上
      3. 创建对象
      4. 为字符串对象申请内存
    2. 方法2:PyString_FromStringAndSize
  • 两种方法的区别
    • 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对象,统一申请内存

posted on 2023-07-15 02:40  lwxc  阅读(106)  评论(0)    收藏  举报