我发现字符串连接似乎比列表连接具有更少的python字节码。
这是一个例子。
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'
。
有谁可以解释为什么我们总是说列表连接要好得多?
答案 0 :(得分:10)
From Efficient String Concatenation in Python
Method 1
:'a'+'b'+'c'
Method 6
:a =''。join(['a','b','c'])
20,000个整数连接成一个长86kb的字符串:
Concatenations per second Process size (kB) Method 1 3770 2424 Method 6 119,800 3000
结论:是,str.join()
明显更快,然后是典型的连接(str1+str2
)。
答案 1 :(得分:3)
因为
''.join(my_list)
比
好多了my_list[0] + my_list[1]
并且优于
my_list[0] + my_list[1] + my_list[2]
并且优于
my_list[0] + my_list[1] + my_list[2] + my_list[3]
更好......
简而言之:
print 'better than'
print ' + '.join('my_list[{}]'.format(i) for i in xrange(x))
适用于任何x
。
答案 2 :(得分:3)
不要相信!永远得到证明!
资料来源:我盯着python源代码一小时,计算出复杂性!
我的发现。
2个字符串。 (假设n是两个字符串的长度)
Concat (+) - O(n)
Join - O(n+k) effectively O(n)
Format - O(2n+k) effectively O(n)
超过2个字符串。 (假设n是所有字符串的长度)
Concat (+) - O(n^2)
Join - O(n+k) effectively O(n)
Format - O(2n+k) effectively O(n)
结果:
如果你有两个字符串技术上连接(+)更好,虽然它与连接和格式完全相同。
如果你有两个以上的字符串concat变得很糟糕,加入和格式实际上是相同的,虽然技术上连接更好一点。
内容:
如果您不关心效率,请使用上述任何一项。 (虽然你问过我会问你关心的问题)
因此 -
如果你有2个字符串使用concat(当不在循环中时!) 如果您有两个以上的字符串(所有字符串)(或在循环中)使用连接 如果你有什么不是字符串使用格式,因为duh。
希望这有帮助!