例如,如果我尝试使用 + 运算符将三个字符串连接在一起:s = "s1"+ "s2"+ "s3",python 如何处理好了吗?
它会计算 len1、len2,然后为大小为 len1 + len2 的新字符串分配内存并重复直到处理完所有 + 运算符吗?
或者它可能计算所有操作数的长度并只执行一次分配?在这种情况下,可以安全地假设
s = "s1" + "s2" + "s3"
会比
执行得更快s = "s1" + "s2"
s += "s3"
或者可能根本没有分配,它只是以某种方式记住操作数的内存地址及其顺序?
非常感谢有关 python 优化主题的文章推荐。
请您参考如下方法:
根据 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
