例如,如果我尝试将三个字符串与+运算符:串联在一起,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优化主题的文章建议。
根据此处的来源,看起来它确实计算了两个字符串的长度,然后创建了一个长度等于新长度总和的新字符串。
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操作码,这与重载字符串连接操作+是为完成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
Run Code Online (Sandbox Code Playgroud)