6

我发现字符串连接的 python 字节码似乎比列表连接少。

这是一个例子。

测试.py:

a = ''.join(['a', 'b', 'c'])
b = 'a' + 'b' + 'c'

然后我执行python -m dis test.py. 我得到了以下 python 字节码(python 2.7):

  1 0 负载常量 0 ('')
              3 LOAD_ATTR 0(加入)
              6 LOAD_CONST 1 ('a')
              9 LOAD_CONST 2 ('b')
             12 LOAD_CONST 3 ('c')
             15 建造清单 3
             18 CALL_FUNCTION 1
             21 STORE_NAME 1(一)

  3 24 LOAD_CONST 6 ('abc')
             27 商店名称 2 (b)
             30 LOAD_CONST 4(无)
             33 返回值  

显然,字符串连接的字节码数量较少。它只是'abc'直接加载字符串。

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

4

3 回答 3

14

来自 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)。

于 2013-04-22T12:46:26.637 回答
4

不要相信!永远拿证据!

来源:我盯着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 会变得很糟糕,并且 join 和 format 实际上是相同的,尽管从技术上来说 join 更好一些。

概括:

如果您不关心效率,请使用上述任何方法。(虽然既然你问了这个问题,我会假设你在乎)

所以 -

如果您有 2 个字符串,请使用 concat (当不在循环中时!)如果您有两个以上的字符串(所有字符串)(或在循环中),请使用 join 如果您没有任何字符串,请使用格式,因为 duh。

希望这可以帮助!

于 2014-02-23T05:31:51.740 回答
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]

更好……</p>

简而言之:

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

对于任何x.

于 2013-04-22T12:41:53.360 回答