list join 真的比 python 中的字符串连接更快吗?

问题描述 投票:0回答:3

我发现字符串连接似乎比列表连接具有更少的 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 加载常数 2 ('b')
             12 LOAD_CONST 3 ('c')
             15 构建列表 3
             18 呼叫功能 1
             21 STORE_NAME 1 (一)

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

很明显,字符串拼接的字节码数量较少,直接加载字符串

'abc'
即可。

谁能解释为什么我们总是说 list join 更好?

python python-2.7 bytecode
3个回答
18
投票

来自 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
显着更快


5
投票

别信!总是得到证明!

来源:盯着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.

希望这有帮助!


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
.

© www.soinside.com 2019 - 2024. All rights reserved.