在我開始使用Python時,+ 就像許多編程語言(如JAVA)一樣,使用加號運算符連接字符串非常直觀且容易。
但是,很快我意識到許多開發(fā)人員似乎喜歡使用該 .join() 方法而不是 + 。在本文中,我將介紹這兩種方法之間的區(qū)別以及為什么不應(yīng)該使用 + 。
開始
作為初學(xué)者,或者剛從其他 + 用于連接字符串的語言切換過來的人,編寫這樣的代碼非常容易:
str1 = "I love "
str2 = "Python."
print(str1 + str2)
隨著越來越多地使用Python,你可能會意識到其他人更喜歡使用這種 join() 方法:
str1 = "I love "
str2 = "Python."
print(''.join([str1, str2]))
老實說,當(dāng)我第一次看到上述方法時,我以為這不是直觀,而是看起來很丑。
連接多個字符串
不過,有一次我需要在列表中加入多個字符串。
strs = ['Life','is','short','I','use','Python']
剛開始的時候,我是這樣完成的:
strs = ['Life', 'is', 'short,', 'I', 'use', 'Python']
def join_strs(strs):
result = ''
for s in strs:
result += ' ' + s
return result[1:]
join_strs(strs)
在這個例子中,我必須編寫一個 for 循環(huán)來逐個連接字符串。另外,結(jié)果字符串需要修剪我在開頭添加的空格,因為所有字符串都需要在前面添加空格,而不是第一個。你可能還有其他解決方案,例如將索引添加到 for 循環(huán)中,以使索引 = 0 處的字符串不應(yīng)添加到該空白中。無論如何,您仍然需要此 for 循環(huán)并為空白做一些事情。
之后,我回想起我以前看過的 .join() 方法,也許這是我需要使用它的時候!
是不是很簡單!一行代碼可以完成所有工作。由于該 .join() 方法是由字符串對象調(diào)用的,因為該字符串對象將用于連接列表中的每個字符串,所以你無需擔(dān)心開頭的空白。
但是,你認(rèn)為這是我們需要使用該join()方法而不是的唯一原因 + 嗎?不,請看下面的內(nèi)容。
join()方法背后的邏輯
讓我們比較這兩種方法的性能。我們可以使用 %timeit Jupyter Notebook 的方法對其進(jìn)行評估。
上面顯示的性能基于10萬條路徑,因此結(jié)果非常自信且顯而易見。使用該 join() 方法可以比使用+連接列表中的字符串快4倍。
為什么?
這是我繪制的概念圖,用于演示+用于連接字符串的方法。
使用+運算符和for循環(huán)將字符串連接到列表中
這顯示了for循環(huán)和+運算符的作用:
- 對于每個循環(huán),可從列表中找到字符串
- Python執(zhí)行程序解釋該表達(dá)式 result += ' ' + s并為空白申請內(nèi)存地址' '。
- 然后,執(zhí)行程序意識到空格需要與字符串連接,因此它將為字符串申請內(nèi)存地址,s第一個循環(huán)為“ Life”。
- 對于每個循環(huán),執(zhí)行程序?qū)⑿枰獌纱紊暾垉?nèi)存地址,一個用于空白,另一個用于字符串
- 有12次內(nèi)存分配
但是,join()方法發(fā)生了什么?
使用“ join()”方法將字符串連接到列表中
- 執(zhí)行程序?qū)⒂嬎懔斜碇杏卸嗌賯€字符串?有6個;
- 這意味著用于連接列表中字符串的字符串將需要重復(fù) 6–1= 5次;
- 它知道總共需要11個內(nèi)存空間,因此所有這些空間將立即應(yīng)用并預(yù)先分配;
- 按順序排列字符串,返回結(jié)果。
因此,很明顯,主要區(qū)別在于內(nèi)存分配的次數(shù)是性能提高的主要原因。
想象一下,使用該 join() 方法將6個字符串連接在一起已經(jīng)快了4倍。如果我們要連接大量字符串怎么辦?它將產(chǎn)生更大的變化!
總結(jié)
在這篇簡短的文章中,我比較了在Python中連接字符串時運 + 算符和 join() 方法之間的區(qū)別。顯然,join() 由于其性能,該方法是優(yōu)選的。
學(xué)習(xí)編程語言通常需要很長的時間,但是Python對于初學(xué)者來說花費的時間相對較短。入門后,開始使用Python,我們不應(yīng)就此止步并滿足于我們可以使用Python所做的事情。大神和普通程序員之間的區(qū)別來自對細(xì)節(jié)的處理。
-END--