是列表加入真的快于Python的字符串连接?(Is list join really faster

2019-08-31 18:02发布

我发现字符串连接似乎有少蟒蛇字节码比列表加入。

这是一个例子。

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'直接。

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

Answer 1:

从Python中的有效字符串连接

Method 1 : 'A' + 'B' + 'C'

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

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

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

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



Answer 2:

因为

''.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



Answer 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(不用时循环!)如果你有两个以上的字符串(所有字符串)(或循环)使用联接如果您有什么不字符串使用格式,因为咄。

希望这可以帮助!



文章来源: Is list join really faster than string concatenation in python?