2016-12-29 29 views
-2

在這個SO帖子裏,https://softwareengineering.stackexchange.com/questions/304445/why-is-s-better-than-for-concatenation,據說%s比+好。但我的測試顯示相反。對於字符串連接,%s是否真的比+更好?

import string 
import random 

R = 10 

def doit1(): 
    x ="" 
    for _ in range(R): 
     x += random.choice(string.letters) 


def doit2(): 
    y = "" 
    for _ in range(R): 
     y = "%s%s" % (y, random.choice(string.letters)) 


if __name__ == '__main__': 
    import timeit 
    print(timeit.timeit("doit1()", setup="from __main__ import doit1")) 
    print(timeit.timeit("doit2()", setup="from __main__ import doit2")) 

是給我下面的輸出:

➜ Documents python3.5 string_test.py 
30.200247984997986 
33.85921495900038 

好像他們幾乎是相同的。我在這裏錯過了什麼嗎?

+1

我想像這種偏好是主要基於*可讀性*而不是性能,這也取決於運行時間和其他因素。 – superuser0

+0

所有用戶投票權下降。定時比較器功能始終與靜態變量一起工作。 'y =「%s%s」%(y,random.choice(string.letters))'這是個玩笑? – dsgdfg

+0

另一點:'x + = random.choice(string.letters)'where is all index? – dsgdfg

回答

1

在你的情況下,字符串格式不是很有用,並且這兩個變體都不是很好的python。連接列表的使用.join

def doit3(): 
    result = [] 
    for _ in range(R): 
     result.append(random.choice(string.letters)) 
    return ''.join(result) 
0

您應該使用哪種方法,使當前任務最有意義。對於給定的例子,這將是str.join

def doit3(): 
    ''.join(random.choice(string.letters) for _ in range(R)) 

如果你有一個簡單的操作,拼接可能是件好事:

dt = '20160108' 
tm = '135623' 
combined = dt+tm 

如果要將變量添加到現有的字符串,用插值(或str.format,或格式字符串文字,或其他):

dt = '20160108' 
tm = '135623' 
result = 'The date is %s and the time is %s.' % (dt, tm) 
+0

一個更快的方式將是'''.join([random.choice(string.letters)for _ in range(R)])''。 BTW'string.letters'應該是'string.ascii_letters' for python 3吧? –

0

這不是性能,但「模板」%(參數),你有一個明確的國家環保總局的事「靜態」內容(模板)和變量參數之間的比例。 根據您創建的字符串類型的不同,這會使事情變得更加可讀(例如,您正在創建html/rest查詢,路徑在模板中清晰可見並且變量參數突出顯示)

If在某些時候你需要本地化,很容易看到你只需要翻譯模板部分,如果你正在創建html請求或sql查詢或類似的東西,很顯然你需要轉義可變部分。

相關問題