建議:字符串拼接操作盡量多用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)