2013-04-22 35 views
2

我发现字符串连接似乎有比列表连接更少的python字节码。列表连接真的比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 

显然,字符串连接的字节码数是直接less.It只是负载串'abc'

任何人都可以解释为什么我们总是说列表连接好得多吗?

+2

因为您并不总是事先知道要连接的字符串。使用'+'或者在事先不知道的许多字符串上使用'sum()'最终会产生一个二次运行时,与经过优化的'.join'相反。 – jamylak 2013-04-22 12:40:30

+0

它将根据用例而有所不同。但总体而言,是的。见http://www.skymind.com/~ocrow/python_string/ – Shane 2013-04-22 12:41:26

+1

请注意,'b ='a'+'b'+'c''利用了不断折叠,因为所有三个操作数在编译时都是已知的。尝试类似'b = a1 + a2 + a3',你会看到更复杂的字节码生成。 – chepner 2013-04-22 13:01:36

回答

9

From Efficient String Concatenation in Python

Method 1: '一个' + 'B' + 'C'

Method 6:一个= ''。加入([ '一', 'B', 'C'])

20000整数被连接成一个字符串86KB长:

pic

   Concatenations per second  Process size (kB) 
    Method 1    3770     2424 
    Method 6    119,800     3000 

结论:YESstr.join()显著更快然后典型级联(str1+str2)。

+0

方法6使用连接,而不是方法3 – marcadian 2013-04-22 17:30:00

+0

@marcadian感谢您指出。愚蠢的错字。 – 2013-04-22 17:35:14

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

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 如果有两个以上的字符串(所有字符串)(如果不是在一个循环!) (或在一个循环中)使用加入 如果你有什么东西没有字符串使用格式,因为啊。

希望这会有所帮助!