我发现字符串拼接比列表连接在Python字节码中使用更少的字节码。这是一个例子。
test.py:
然后我执行
有人能解释一下为什么我们总是说列表连接更好吗?
test.py:
a = ''.join(['a', 'b', 'c'])
b = 'a' + 'b' + 'c'
然后我执行
python -m dis test.py
。我得到了以下Python字节码(Python 2.7):
1 0 LOAD_CONST 0 ('') 3 LOAD_ATTR 0 (join) 6 LOAD_CONST 1 ('a') 9 LOAD_CONST 2 ('b') 12 LOAD_CONST 3 ('c') 15 BUILD_LIST 3 18 CALL_FUNCTION 1 21 STORE_NAME 1 (a)显然,字符串连接的字节码数较少。它直接加载字符串
3 24 LOAD_CONST 6 ('abc') 27 STORE_NAME 2 (b) 30 LOAD_CONST 4 (None) 33 RETURN_VALUE
'abc'
。有人能解释一下为什么我们总是说列表连接更好吗?
+
,或在许多未知字符串上使用sum()
最终会导致二次运行时间,而不是经过优化的.join
。 - jamylakb='a' + 'b' + 'c'
利用了常量折叠,因为所有三个操作数在编译时都是已知的。尝试像b = a1 + a2 + a3
这样的操作,你会看到更复杂的字节码生成。 - chepner