在Python中,使用列表连接真的比字符串拼接更快吗?

7
我发现字符串拼接比列表连接在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'
有人能解释一下为什么我们总是说列表连接更好吗?

2
因为您并不总是预先知道要连接哪些字符串。使用 +,或在许多未知字符串上使用 sum() 最终会导致二次运行时间,而不是经过优化的 .join - jamylak
这将根据使用情况而异。但总的来说,是的。请参见http://www.skymind.com/~ocrow/python_string/。 - Shane
2
请注意,b='a' + 'b' + 'c' 利用了常量折叠,因为所有三个操作数在编译时都是已知的。尝试像 b = a1 + a2 + a3 这样的操作,你会看到更复杂的字节码生成。 - chepner
3个回答

18

Python中高效的字符串拼接

方法1:'a' + 'b' + 'c'

方法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快得多

3
链接失效。 - problemofficer - n.f. Monica
1
https://web.archive.org/web/20120902083755/http://www.skymind.com/~ocrow/python_string - Rony Macfly
当前的URL是:https://waymoot.org/home/python_string/ - brunoais

5

不要轻信!总是要拿到证据!

来源:我盯着Python源代码看了一个小时并计算了复杂度!

我的发现:

针对两个字符串。(假设n为两个字符串的长度)

Concat (+) - O(n)
Join - O(n+k) effectively O(n)
Format - O(2n+k) effectively O(n)

如果需要处理超过两个字符串(假设总长度为n),可以使用以下方法:

Concat (+) - O(n^2)
Join - O(n+k) effectively O(n)
Format - O(2n+k) effectively O(n)

结果:

如果你有两个字符串,技术上来说连接符(+)更好一些,但实际上它与join和format完全相同。

如果你有超过两个字符串,concat变得很糟糕,而join和format在效果上是相同的,尽管从技术上讲join稍微优于format。

总结:

如果你不关心效率,可以使用上述任意一种方法。(但既然你提出了问题,我会认为你关心)

因此 -

如果你有两个字符串,请使用concat(当不在循环中时!) 如果你有超过两个字符串(所有的字符串)(或者在循环中),请使用join 如果你有其他类型的对象,请使用format,因为显而易见。

希望这可以帮助到你!


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]

and better…

In short:

print 'better than'
print ' + '.join('my_list[{}]'.format(i) for i in xrange(x))

对于任何x


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接