曾经有次面试,面试官问我:怎么把字符串拼起来?
我心想,这么简单的问题还在问,毫不犹豫的回答 用 +
面试官说:你都不考虑性能的吗?
我。。。
今天就来探究下字符串拼接的性能。
方法一:用 +
加号虽然简单明了,但是性能肯定是不理想的,看一个简单的例子:
def add(lst):
string=''
for s in lst:
string+=s
print(id(string)) # 查看对象ID
return string
发现结果是:
2095485758912
2095484872776
2095484872776
2095484872776
2095484872776
2095605379888
2095605379888
2095605379888
2095605379888
2095484884216
2095484884216
...
可见 字符串长度增加到一定程度,就创建了新的字符串对象,性能就出在这里
方法二:用join()
比较两种方法所用时间
1.+
def add(lst):
string=''
for s in lst:
string+=s
return string
%timeit string=add(char)
# 4.75 µs ± 400 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
2.join
%timeit string=''.join(char)
# 681 ns ± 22.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
ps: 1 微秒 = 1000 纳秒
+所花费的时间约是join的6.98倍,合并的字符串越多,效果越明显,性能差异越大
另:使用reduce的时间比单纯使用for循环的时间更长:
from functools import reduce
%timeit string=reduce(lambda x,y:x+y,char)
# 7.04 µs ± 196 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)