Python源码学习笔记 3 字符串对象

本文详细探讨了Python字符串对象的内部结构,包括PyStringObject的定义、创建方式如PyString_FromString和PyString_FromStringAndSize,字符串对象的删除,interned机制如何提高比较效率,字符串缓冲池如何优化单字符创建,以及如何通过join方法解决字符串连接的性能问题。
摘要由CSDN通过智能技术生成

1.PyStringObject

typedef struct {
    PyObject_VAR_HEAD
    long ob_shash; //存储字符串hash值,初始为-1
    int ob_sstate; //表明该字符串是否经过intend处理
    char ob_sval[1];//实际存储字符串位置,默认为一个字符数组,但创建时会根据size大小扩展此空间
} PyStringObject;

PyString_Type:
类型对象

[stringobject.c]
PyTypeObject PyString_Type = {
    PyObject_HEAD_INIT(&PyType_Type)
    0,
    "str",
    sizeof(PyStringObject),
    sizeof(char), //tp_itemsize指明变长对象保存的单位长度为一个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 */
};

2.PyStringObject的创建

PyString_FromString:

 [stringobject.c]
PyObject* PyString_FromString(const char *str)
{
    register size_t size;
    register PyStringObject *op;

    size = strlen(str);  //计算size
    if (size > PY_SSIZE_T_MAX) {   //判断字符串长度是否超过范围
        return NULL;
    }

    if (size == 0 && (op = nullstring) != NULL) { //nullstring对象可能未创建
        return (PyObject *)op;
    }

    if (size == 1 && (op = characters[*str & UCHAR_MAX]) != NULL) { //判断单字符是否在缓冲区
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值