我发现字符串连接似乎比列表连接具有更少的 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 更好?
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
)显着更快。
别信!总是得到证明!
来源:盯着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.
希望这有帮助!
因为
''.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
.