曾经有次面试,面试官问我:怎么把字符串拼起来?
我心想,这么简单的问题还在问,毫不犹豫的回答 用 +
面试官说:你都不考虑性能的吗?
我。。。
今天就来探究下字符串拼接的性能。
方法一:用 +加号虽然简单明了,但是性能肯定是不理想的,看一个简单的例子:
def add(lst): string='' for s in lst: string+=s print(id(string)) # 查看对象ID return string发现结果是:20954857589122095484872776209548487277620954848727762095484872776209560537988820956053798882095605379888209560537988820954848842162095484884216...可见 字符串长度增加到一定程度,就创建了新的字符串对象,性能就出在这里
方法二:用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)