python如何实现串联?

Sad*_*aze 1 python python-3.x

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

s = "s1" + "s2" + "s3"
Run Code Online (Sandbox Code Playgroud)

执行速度比

s = "s1" + "s2"
s += "s3"
Run Code Online (Sandbox Code Playgroud)

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

Dev*_*ngh 5

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

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);
Run Code Online (Sandbox Code Playgroud)

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

当你拆开通过功能dis.dis,你可以看到BINARY_ADD操作码,这与重载字符串连接操作+是为完成s1s2,然后在前面的操作与结果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
Run Code Online (Sandbox Code Playgroud)