建议:字符串拼接操作尽量多用join,而减少用”+“
join操作时会先计算字符操作所用到的空间总和大小,然后申请内存。然后进行字符串连接操作。所以join的时间复杂的近似O(n)。
+操作符连接操作符时,由于字符串是不可变对象,所以多个字符串拼接操作时从前向后的依此计算,用前一次的计算结果再和下一个字符串拼接。所以每次操作都需要申请一块新的内存。举例:S1+S2+S3+…Sn,实际过程是:1、先申请一块内存;2、将S1、S2复制到这块内存中(这样这块内存就是S1+S2);3、继续第一步申请内存;4、继续把第二步的内存内容和S3复制到第三步申请的内存。然后重复第一步到第二步至计算到Sn。所以操作符”+“的时间复杂的近似O(n^2)
对于不同个数字符串拼接操作时join和+所用时间对比(python2.7环境运行结果):
链接字符串数量
join操作消耗时间
+操作消耗时间
3
0.011083841323852539
0.02231597900390625
10
0.014094829559326172
0.05936312675476074
100
0.1445930004119873
0.6129770278930664
1000
1.340691089630127
6.07816481590271
10000
13.942554950714111
61.60126209259033
参考计算运算上面时间的代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import timeit
strlist = ["it is a value string will not keep in memorty" for n in range(100000)]
def join_test():
return ‘‘.join(strlist)
def plus_test():
result = ‘‘
for i,v in enumerate(strlist):
result = result + v
return result
if __name__ == ‘__main__‘:
x = [3,10,100,1000,10000]
jointd = {3:0,10:0,100:0,1000:0,10000:0}
plustd = {3:0,10:0,100:0,1000:0,10000:0}
for i in x:
jointimer = timeit.Timer("join_test()","from __main__ import join_test")
jointd[i] = jointimer.timeit(number=i)
plustimer = timeit.Timer("plus_test()","from __main__ import plus_test")
plustd[i] = plustimer.timeit(number=i)
print (‘join use time:\n‘,jointd)
print (‘plus use time:\n‘, plustd)