列表连接真的比python中的字符串连接快吗?

时间:2013-04-22 12:39:48

标签: python python-2.7 bytecode

我发现字符串连接似乎比列表连接具有更少的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'

有谁可以解释为什么我们总是说列表连接要好得多?

3 个答案:

答案 0 :(得分:10)

From Efficient String Concatenation in Python

Method 1:'a'+'b'+'c'

Method 6:a =''。join(['a','b','c'])

20,000个整数连接成一个长86kb的字符串:

pic

                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。

希望这有帮助!