面試python崗位,提問:連線字串用join還是+,怎麼回答?

上海小小胖發表於2019-03-13

Python學習

本篇要講的是,連線字串的時候可以用join也可以用+,但這兩者有沒有區別呢? 關注公眾號:「Python專欄」,後臺回覆「騰訊架構資源1」,獲取由騰訊架構師整理的大資料學習資源包全套!!!

Python專欄二維碼

我們先來看一下用join和+連線字串的例子

str1 = " ".join(["hello", "world"])
str2 = "hello " + "world"

print(str1)  # 輸出 “hello world"
print(str2)  # 輸出 “hello world"
複製程式碼

兩者的結果是一樣,那麼考慮這樣一個問題,這兩者在效能上有區別嗎? 我們來做個實驗,比較下join和+的效能

import timeit

def test1(strlist):
    return "".join(strlist)

def test2(strlist):
    result = ""
    for v in strlist:
        result = result+v
    return result

if __name__ == "__main__":
    strlist = ["a very very very very very very very long string" for n in range(100000)]
    timer1 = timeit.Timer("test1(strlist)", "from __main__ import strlist, test1")
    timer2 = timeit.Timer("test2(strlist)", "from __main__ import strlist, test2")
    time1 = timer1.timeit(number=100)
    time2 = timer2.timeit(number=100)
    print("join: %f, plus: %f" % (time1, time2))
複製程式碼

那麼這裡我們不對timeit模組做過多解釋,你們可以理解為是一個對程式碼效率進行檢測執行耗時的模組。下次我們單獨起一篇來說這個timeit。

上面的程式有如下的輸出

join: 0.116944, plus: 0.394379
複製程式碼

可以看到,join的效能明顯好於+。這是為什麼呢?

原因是這樣的,字串是不可變物件,當用操作符+連線字串的時候,每執行一次+都會申請一塊新的記憶體,然後複製上一個+操作的結果和本次操作的右操作符到這塊記憶體空間,因此用+連線字串的時候會涉及好幾次記憶體申請和複製。

而join在連線字串的時候,會先計算需要多大的記憶體存放結果,然後一次性申請所需記憶體並將字串複製過去,這是為什麼join的效能優於+的原因。

所以在連線字串陣列的時候,我們應考慮優先使用join。

相關文章