join和+的區別


連接字符串的時候可以用join也可以用+,但這兩者有沒有區別呢?

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

str1 = " ".join(["hello", "world"])
str2 = "hello " + "world"
print(str1)  # 輸出 “hello world"
print(str2)  # 輸出 “hello world"

兩者的結果是一樣,那么考慮這樣一個問題,這兩者在性能上有區別嗎?

我們來做個實驗,比較下join和+的性能

import timeit,time
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(1000)]
    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))



    strlist1 = ["very very very long long" ,"very long long long","very long long long","very long long long","very long long long"]
    time1 = time.time()
    for i in range(100000):
        test1(strlist1)
    time2 = time.time()
    time3 = time.time()
    for i in range(100000):
        test2(strlist1)
    time4 = time.time()
    print ("join:%s" %(time2-time1))
    print("+ :%s" % (time4-time3))

輸出:

join: 0.003507, plus: 0.083788
join:0.18189620971679688
+ :0.3727850914001465

  

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

原因是這樣的,字符串是不可變對象,當用操作符+連接字符串的時候,每執行一次+都會申請一塊新的內存,因此用+連接字符串的時候會涉及好幾次內存申請和復制。而join在連接字符串的時候,會先計算需要多大的內存存放結果,然后一次性申請所需內存並將字符串復制過去,這是為什么join的性能優於+的原因。所以在連接字符串數組的時候,我們應考慮優先使用join


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM