例如,如果我尝试将三个字符串与+
运算符:s = "s1" + "s2" + "s3"
串联在一起,python如何处理它?<br/>
它会计算len1,len2,然后为大小为len1 + len2的新字符串分配内存,然后重复执行直到所有+
运算符都处理完了吗?
还是它可以计算所有操作数的长度并只执行一次分配?在这种情况下,可以假设
s = "s1" + "s2" + "s3"
执行速度比
快s = "s1" + "s2"
s += "s3"
或者也许根本没有分配,而它只是以某种方式记住了操作数的内存地址及其顺序?
感谢有关python优化主题的文章建议。
答案 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