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