当前位置:首页 > 科技 >

《python源码剖析》笔记 python中的字符串对象

发布时间:2017-09-12 15:30:31

《python源码剖析》笔记 python中的字符串对象

1. PyStringObject --> 变长不可变对象

typedef struct{ PyObject_VAR_HEAD//ob_size变量保存着对象中维护的可变长度内存的大小 longob_shash; //缓存该对象的hash值,用于dict的查询 intob_sstate; //标志该对象是否经过intern机制的处理 char ob_sval[1];// 字符指针,站群,指向一段内存 } PyStringObject;

PyString_Type --> PyStringObject的类型对象。

PyTypeObjectPyString_Type = { PyObject_HEAD_INIT(&PyType_Type) 0, str, sizeof(PyStringObject), sizeof(char), //…… (reprfunc)string_repr, /* tp_repr */ &string_as_number, /* tp_as_number */ &string_as_sequence, /* tp_as_sequence */ &string_as_mapping, /* tp_as_mapping */ (hashfunc)string_hash, /* tp_hash */ 0, /* tp_call */ //…… string_new, /* tp_new */ PyObject_Del, /* tp_free */ };

PyStringObject对数值操作、序列操作和映射操作都支持

2. 创建PyStringObject对象

两种途径:

PyObject *PyString_FromString(const char *str) PyObject *PyString_FromStringAndSize(const char *str, intsize)

PyString_FromString

1. 判断字符串长度:PY_SSIZE_T_MAX

2. 处理null string

3. 处理单个字符

4. 申请内存,创建新的PyStringObject对象,并初始化。

5. intern(共享)长度较短的PyStringObject对象

3. 字符串对象的intern机制

对于intern之后的字符串,在整个python的运行期间,比如“Ruby”,系统中都只有唯一的一个与”Ruby”字符串对应的PyStringObject对象。

如果对于a应用了intern机制,那么之后要创建b的时候,Python会首先在系统中记录的已经被intern机制处理了的PyStringObject对象中查找,如果发现该字符数组对应的PyStringObject对象已经存在了,就直接将该对象的引用返回。

interned是(key, value)集合 --> key, value是对应的PyStringObject对象的引用

interned中的指针还能作为a的有效引用,因此在将a的PyObject指针作为key和value添加到interned中后,要将a的引用计数减2,不然a在python结束之前永远不会被删除。

Python在运行时创建了一个PyStringObject对象temp后,基本上都会调用PyString_InternInPlace对temp进行处理,intern机制会减少temp的引用计数,temp对象会由于引用计数减为0而被销毁。

4. 字符缓冲池

1) 创建 PyStringObject 对象”P”

2) 对对象”P”进行 Intern 操作

3) 将对象”P”缓存至字符缓冲池中

好像只是为了加速查找?

5. PyStringObject效率相关问题

字符串连接操作

“+”效率低下,连接N个PyStringObject要进行N-1次内存申请和搬运的工作

推荐用join


企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:宜昌SEO http://yichang.4567w.com