python字符串计算加法_深入探究Python:字符串加法

从Python3字符串统一使用Unicode编码

1.字符串加法

#源码

a="dddddddddd"

b="sssssssssss"

a = a+b

#字节码

0 LOAD_NAME 0 (a)

2 LOAD_NAME 1 (b)

4 BINARY_ADD

6 STORE_NAME 0 (a)

8 LOAD_CONST 0 (None)

10 RETURN_VALUE

【BINARY_ADD】#源码有删减

PyObject *right = POP();#出栈right

PyObject *left = TOP();#指向栈顶left

PyObject *sum;#新对象sum

#针对字符串加法运算的优化

if (PyUnicode_CheckExact(left) &&PyUnicode_CheckExact(right)) {

sum = unicode_concatenate(tstate, left, right, f, next_instr);

}

else {

'''

}

SET_TOP(sum);#重新设置栈顶

//源码有删减

static PyObject *

unicode_concatenate(PyThreadState *tstate, PyObject *v, PyObject *w,

PyFrameObject *f, const _Py_CODEUNIT *next_instr)

{

PyObject *res;

if (Py_REFCNT(v) == 2) {

int opcode, oparg;#字节码指令和指令参数

NEXTOPARG();#获取下一字节码指令

switch (opcode) {#根据下一字节码指令进行优化

case STORE_FAST:

{

''''

}

case STORE_DEREF:

{

''''

}

case STORE_NAME:#这是我们执行的情况

{

PyObject *names = f->f_code->co_names;#获取code对象name元组

PyObject *name = GETITEM(names, oparg);#获取参数名

PyObject *locals = f->f_locals;#获取局部参数字典

if (locals && PyDict_CheckExact(locals)) {

PyObject *w = PyDict_GetItemWithError(locals, name);

#两种情况直接返回

if ((w == v && PyDict_DelItem(locals, name) != 0) ||

(w == NULL && _PyErr_Occurred(tstate)))

{

Py_DECREF(v);

return NULL;

}

}

break;

}

}

}

res = v;

PyUnicode_Append(&res, w);#通常情况调用的函数

return res;

}

//源码有删减

void

PyUnicode_Append(PyObject **p_left, PyObject *right)

{

PyObject *left, *res;

Py_UCS4 maxchar, maxchar2;

Py_ssize_t left_len, right_len, new_len;

'''


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部