Python 連接字符串應(yīng)優(yōu)先使用 join 而不是 +

Python 連接字符串應(yīng)優(yōu)先使用 join 而不是 +

簡介

字符串處理在大多數(shù)編程程序語言中都不可避免,字符串的連接也是在編程過程中經(jīng)常需要面對(duì)的問題扮授。 Python中的字符串與其他一些程序語言如C++芳室、Java有一些不同,它為不 可變對(duì)象刹勃。 一旦創(chuàng)建便不能改變渤愁,它的這個(gè)特性直接影響到Python中字符串連接的效率。 我們首先來看常見的兩種字符串連接方法深夯。

使用操作符+連接字符串的方法如下:

strl, str2, str3 =“testing”, “string”,“concatenation”

strl + str2 + str3

‘testingstringconcatenation’

3.9.2. 使用join方法連接字符串的方法如下:

‘’.join ([strl, str2, str3])

‘testingstringconcatenation’

思考這么一個(gè)問題:上述兩種字符串連接的方法除了使用形式上的不同還有其他區(qū)別 嗚?性能上會(huì)不會(huì)有所差異呢诺苹?來看下面這個(gè)測(cè)試?yán)樱?/p>

import timeit

#生成塒試所雋要的字符數(shù)組

strlist=[“it is a long value string will not keep in memory” for n in range(100000)]

def join_test():

#使用join方法連接strlist中的元#并返回字符串

return ’ ’ . join (strlist)

def plus_test():

result =“”

for i,v in enumerate(strlist):

#使用*進(jìn)行宇符串連接

result=(result + v)

return result

現(xiàn)在開始測(cè)試:

jointimer = timeit.Timer(“join_test()” ,“from main import join_test”)

print (jointimer.timeit(number = 100))

0.11032061399964732

第二種方式:

plustimer = timeit.Timer (“plus_test()”,“from main import plus_test”)

print( plustimer.timeit(number = 100))

1.025606508999772

給上曲的程序傳入一組測(cè)試參數(shù)(測(cè)試參數(shù)為3, 10,100咕晋,1000,10000, 100000; 分 別表示每一次測(cè)試所要連接的字符串的數(shù)量X程序用于測(cè)試 join_test() 和 plus_test() 這兩個(gè)方法在宇符串連接規(guī)模改變時(shí)所消耗時(shí)間的變化收奔。


從分析測(cè)試結(jié)果圖表我們不難發(fā)現(xiàn):分別使用join方法和使用+操作符來連接字符串. join()方法的效率要高于+操作符掌呜,特別是字符串規(guī)模較大的時(shí)候,join()方法的優(yōu)勢(shì)更為明顯(如連接數(shù)為100000的時(shí)候坪哄,兩者耗時(shí)相差上百倍)质蕉。造成這種差別的原因在哪里呢?我們來探討一下翩肌。當(dāng)用操作符+連接字符串的時(shí)候.由于字符串是不可變對(duì)象.其工作原理實(shí)際上是這樣的:如果要連接如下字符串:S1+S2+S3+…….+SN模暗,執(zhí)行一次+操作便會(huì)在內(nèi)存中申請(qǐng)一塊新的內(nèi)存空間,并將上一次操 作的結(jié)果和本次操作的右操作數(shù)復(fù)制到新 申請(qǐng)的內(nèi)存空間念祭,即當(dāng)執(zhí)行SI+S2的時(shí)候 會(huì)申請(qǐng)一塊內(nèi)存兑宇,并將SI、S2復(fù)制到該內(nèi) 存屮.依次類推粱坤。

因此.在 N個(gè)字符串連接的過程中隶糕,會(huì)產(chǎn)生N-I個(gè) 中間結(jié)果,每產(chǎn)生一個(gè)中間結(jié)果都需要申 請(qǐng)和復(fù)制一次內(nèi)存站玄,總共需要申請(qǐng)N-1次 內(nèi)存枚驻,從而嚴(yán)童影響了執(zhí)行效率。N越大株旷,

對(duì)內(nèi)存的申請(qǐng)和復(fù)制的次數(shù)越多再登,+操作符的效率就越低。因此.整個(gè)字符連接的過程中灾常, 相當(dāng)于S1被復(fù)制N-1次霎冯,S2被復(fù)制N-2次….SN復(fù)制1次(并不完全等同于S1復(fù)制N-1 次,因?yàn)楹罄m(xù)復(fù)制都是對(duì)中間結(jié)果的復(fù)制所以字符串的連接時(shí)間復(fù)雜度近似為O(n^2)钞瀑。 而當(dāng)用 join() 方法連接字符串請(qǐng)的總的內(nèi)存空間沈撞,然后一次 性申請(qǐng)所需內(nèi)存并將字符序列中的每一個(gè)元素復(fù)制到內(nèi)存中去, 所以 join 操作的時(shí)間復(fù)雜度 為 O(n)

因此雕什,宇符串的連接缠俺,特別是大規(guī)模字符串的處理显晶,應(yīng)該盡量優(yōu)先使用 join 而不是 + 。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末壹士,一起剝皮案震驚了整個(gè)濱河市磷雇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌躏救,老刑警劉巖唯笙,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異盒使,居然都是意外死亡崩掘,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門少办,熙熙樓的掌柜王于貴愁眉苦臉地迎上來苞慢,“玉大人,你說我怎么就攤上這事英妓⊥旆牛” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵蔓纠,是天一觀的道長辑畦。 經(jīng)常有香客問我,道長贺纲,這世上最難降的妖魔是什么航闺? 我笑而不...
    開封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮猴誊,結(jié)果婚禮上潦刃,老公的妹妹穿的比我還像新娘。我一直安慰自己懈叹,他們只是感情好乖杠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著澄成,像睡著了一般胧洒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上墨状,一...
    開封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天卫漫,我揣著相機(jī)與錄音,去河邊找鬼肾砂。 笑死列赎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的镐确。 我是一名探鬼主播包吝,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼饼煞,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了诗越?” 一聲冷哼從身側(cè)響起砖瞧,我...
    開封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嚷狞,沒想到半個(gè)月后块促,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡床未,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年褂乍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片即硼。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖屡拨,靈堂內(nèi)的尸體忽然破棺而出只酥,到底是詐尸還是另有隱情,我是刑警寧澤呀狼,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布裂允,位于F島的核電站,受9級(jí)特大地震影響哥艇,放射性物質(zhì)發(fā)生泄漏绝编。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一貌踏、第九天 我趴在偏房一處隱蔽的房頂上張望十饥。 院中可真熱鬧,春花似錦祖乳、人聲如沸逗堵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜒秤。三九已至,卻和暖如春亚斋,著一層夾襖步出監(jiān)牢的瞬間作媚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來泰國打工帅刊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纸泡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓厚掷,卻偏偏與公主長得像弟灼,于是被迫代替她去往敵國和親级解。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容