2016-08-16 91 views
-1

串聯字符串:str + str或「{:s} {:s}」。format()?

str_ = "foo" + "bar" 

str_ = "{:s}{:s}".format("foo","bar") 

任何區別還是純粹的偏好?

+0

我最近讀到+是小弦更快。但我認爲它是一個風格或可讀性的問題 –

+0

相關:http://stackoverflow.com/q/3055477/344286 –

+0

''foo「+」bar「'被編譯器轉換爲''foobar」',所以運行時成本爲零。更好的比較可能是'foo =「foo」; bar =「bar」; str_ = foo + bar'。 – tdelaney

回答

2

語義上?不,最終加入"foo""bar"並將它們分配到str

Computationally?當然,Python在編譯期間會爲"foobar"創建文字,str = "foo" + "bar"分配將會更快。

從可讀性方面?同樣,str = "foo" + "bar"肯定更清晰簡潔。


兩個你的例子常見的勘誤表是,你分配給被內置的名字,所以不這樣做,你掩蓋它這str

+0

我知道'str'是內置的,只是用它作爲名稱。會改變。 – socrates

+0

@socrates避免了這種情況,它可能會導致你在生活中不需要的惡劣情況:-) –

1

要完成@Jim解釋,這裏是展示這兩種方法之間的比較有點風向標:F1 = 4.49492255239s和f2 = 47.5562411453s

所以:

# measure execution time 
import timeit 

def f1(num_iterations): 
    for i in range(num_iterations): 
     value = "foo" + "bar" 

def f2(num_iterations): 
    for i in range(num_iterations): 
     value = "{:s}{:s}".format("foo", "bar") 

N = 100000000 

print timeit.timeit('f1(N)', setup='from __main__ import f1, N', number=1) 
print timeit.timeit('f2(N)', setup='from __main__ import f2, N', number=1) 

在我的筆記本電腦,結果使當N很大時,結論是使用格式比使用更簡單的str級聯版本慢得多。

+0

這是'timeit'的一個奇怪用法。您已將循環放入測量中,只運行一次。對於'f1'來說,循環的成本遠遠大於你試圖使用的時間的成本,結果是沒有意義的。 'timeit('value =「foo」+「bar」')'會是更標準的做法。 – tdelaney

0

問候吉姆回答,使用+運算符與許多字符串,可以很慢。

避免做這樣的事情:

s = ' ' 
for p in parts: 
    s += p 

每個+=操作創建一個新的字符串。爲了避免這種情況,請使用join()。在你的例子中,你不需要使用+。只需將它們相鄰放置,不加+。

string = 'foo' 'bar' 
print(string) 
>"foobar" 
+1

請注意''foo「」bar「'* only *適用於字符串文字,併發生在」編譯「時間。 –

+0

@WayneWerner是的,就像OP問題一樣。 – levi

2

如果你想看到實際的區別:

import dis 

def concat(): 
    return 'foo' + 'bar' 

def format(): 
    return '{}{}'.format('foo', 'bar') 

dis.dis(concat) 
print('*'*80) 
dis.dis(format) 
+1

同樣,只是'dis.dis(「'foo'+'bar'」)'和'dis.dis('「{:s} {:s}」.format(「foo」,「bar」)') '。 –