你所看到的時差來自創建列表以傳遞給join
。雖然你可以用一個元組來取得一個小的加速,但是當只有幾個短的字符串的時候,它仍然會比只與+
連接時慢。
如果你有一個可以迭代的字符串來啓動,而不是一個帶有字符串的對象作爲屬性,那將是不同的。然後你可以直接在迭代器上調用join
,而不需要爲每個調用建立一個新的。
這裏的一些測試中,我與timeit
模塊做:
import timeit
short_strings = ["foo", "bar", "baz"]
long_strings = [s*1000 for s in short_strings]
def concat(a, b, c):
return a + b + c
def concat_from_list(lst):
return lst[0] + lst[1] + lst[2]
def join(a, b, c):
return "".join([a, b, c])
def join_tuple(a, b, c):
return "".join((a, b, c))
def join_from_list(lst):
return "".join(lst)
def test():
print("Short strings")
print("{:20}{}".format("concat:",
timeit.timeit(lambda: concat(*short_strings))))
print("{:20}{}".format("concat_from_list:",
timeit.timeit(lambda: concat_from_list(short_strings))))
print("{:20}{}".format("join:",
timeit.timeit(lambda: join(*short_strings))))
print("{:20}{}".format("join_tuple:",
timeit.timeit(lambda: join_tuple(*short_strings))))
print("{:20}{}\n".format("join_from_list:",
timeit.timeit(lambda: join_from_list(short_strings))))
print("Long Strings")
print("{:20}{}".format("concat:",
timeit.timeit(lambda: concat(*long_strings))))
print("{:20}{}".format("concat_from_list:",
timeit.timeit(lambda: concat_from_list(long_strings))))
print("{:20}{}".format("join:",
timeit.timeit(lambda: join(*long_strings))))
print("{:20}{}".format("join_tuple:",
timeit.timeit(lambda: join_tuple(*long_strings))))
print("{:20}{}".format("join_from_list:",
timeit.timeit(lambda: join_from_list(long_strings))))
輸出:
Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:57:17) [MSC v.1600 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>>
>>> test()
Short strings
concat: 0.5453461176251436
concat_from_list: 0.5185697357936024
join: 0.7099379456477868
join_tuple: 0.5900842397209949
join_from_list: 0.4177281794285359
Long Strings
concat: 2.002303591571888
concat_from_list: 1.8898819841869416
join: 1.5672863477837913
join_tuple: 1.4343144915087596
join_from_list: 1.231374639083505
因此,從現有列表加入始終是最快的。與+
連接時,如果個別項目較短,則速度較快,但對於較長的字符串,它總是最慢。我懷疑在concat
和concat_from_list
之間顯示的差異來自測試代碼中函數調用中列表的解包。
http://stackoverflow.com/questions/3055477/how-slow-is-pythons-string-concatenation-vs-str-join – idanshmu
cPython具有非常高效的就地字符串連接。我不會驚訝地發現,兩個連接操作比實現列表更快,然後執行'''.join'。 – roippi