《python源码剖析》笔记 python中的字符串对象
来源:互联网 发布:mac 安装包 编辑:程序博客网 时间:2024/05/05 08:17
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie
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
- 《python源码剖析》笔记 python中的字符串对象
- Python源码剖析(03 Python中的字符串对象)
- 《python源码剖析》笔记 python中的整数对象
- 《python源码剖析》笔记 python中的List对象
- 《python源码剖析》笔记 python中的Dict对象
- 《Python源码剖析》阅读笔记:第三章-字符串对象
- 《python源码剖析》笔记 python对象初探
- Python源码剖析(02 Python中的整数对象)
- Python源码剖析(04 Python中的List对象)
- 《Python源码剖析》阅读笔记:第一章-Python对象
- python源码剖析笔记1——Python对象初见
- Python源码剖析笔记2-Python整数对象
- 《python源码剖析》笔记 python虚拟机中的一般表达式
- 《python源码剖析》笔记 python虚拟机中的函数机制
- Python源码学习笔记 3 字符串对象
- Python源码剖析[6] —— 字符串对象(1)
- Python源码剖析[7] —— 字符串对象(2)
- Python源码剖析[8] —— 字符串对象(3)
- JDK动态代理实现原理
- JQuery中extend详细介绍和使用
- 相册
- [Cocoa]深入浅出 Cocoa 之 Core Data(1)- 框架详解
- Linux下SVN的使用 备忘
- 《python源码剖析》笔记 python中的字符串对象
- USB hub驱动分析(1)--硬件篇
- Swift学习一
- thinkphp的sql查询语句
- oracle删除oem中自动备份job
- Linux下的硬件驱动——USB设备(下)
- 设计和实现简单的协议,支持传输文件名和文件内容
- jQuery UI
- <C/C++基础>设计一个String类(重载运算符等)