python如何实现串联?

时间:2019-06-10 07:20:13

标签: python python-3.x

例如,如果我尝试将三个字符串与+运算符:s = "s1" + "s2" + "s3"串联在一起,python如何处理它?<​​br/> 它会计算len1,len2,然后为大小为len1 + len2的新字符串分配内存,然后重复执行直到所有+运算符都处理完了吗?
还是它可以计算所有操作数的长度并只执行一次分配?在这种情况下,可以假设

s = "s1" + "s2" + "s3"

执行速度比

s = "s1" + "s2"
s += "s3"

或者也许根本没有分配,而它只是以某种方式记住了操作数的内存地址及其顺序?
感谢有关python优化主题的文章建议。

1 个答案:

答案 0 :(得分:5)

根据此处的source,看起来它确实计算了两个字符串的长度,然后创建了一个长度等于新长度之和的新字符串

left_len = PyUnicode_GET_LENGTH(left);
right_len = PyUnicode_GET_LENGTH(right);
if (left_len > PY_SSIZE_T_MAX - right_len) {
    PyErr_SetString(PyExc_OverflowError,
                    "strings are too large to concat");
    return NULL;
}
new_len = left_len + right_len;

maxchar = PyUnicode_MAX_CHAR_VALUE(left);
maxchar2 = PyUnicode_MAX_CHAR_VALUE(right);
maxchar = Py_MAX(maxchar, maxchar2);
/* Concat the two Unicode strings */
result = PyUnicode_New(new_len, maxchar);

对于三个字符串,它连接前两个字符串,然后将结果连接到第三个字符串。

通过dis.dis反汇编函数时,可以看到BINARY_ADD操作码是对+进行的带有重载s1的字符串连接操作,并且s2,然后再进行上一次s3操作的结果

In [34]: def f(s1,s2,s3): 
    ...:     return s1+s2+s3 
    ...:                                                                        

In [35]: dis.dis(f)                                                             
  2           0 LOAD_FAST                0 (s1)
              2 LOAD_FAST                1 (s2)
              4 BINARY_ADD
              6 LOAD_FAST                2 (s3)
              8 BINARY_ADD
             10 RETURN_VALUE