2011-08-05 29 views
8

將一個變量和一個字符串組合起來用Python打印時,似乎有很多方法可以做同樣的事情;Python打印/格式方法之間的區別

test = "Hello" 
print "{} World".format(test) #Prints 'Hello World' 
print test+" World" #Prints 'Hello World' 
print "%s World" % test #Prints 'Hello World' 

什麼(如果有的話)是在性能,兼容性和通用偏好詞這些方法之間的區別。即使在開源項目之間,所有三種方法似乎都可以互換使用。

+1

爲什麼你會關注性能......打印聲明?你打算打印多少?哈哈。他們幾乎都是一樣的。使用任何作品。 – john

+2

@awfullyjohn我想這不僅僅是一個實際的問題,我只是有興趣,如果有不同的方法背後的歷史 – Smudge

+0

請閱讀http://www.codinghorror.com/blog/2009/01/the- sad-tragedy-of-micro-optimization-theater.html因爲你對這個主題的性能問題的擔憂(python和C#有類似的字符串實現,所以結論同樣適用) – SingleNegationElimination

回答

8

正如您所提到的,各種開源項目將使用所有這些方法進行字符串格式化。不過,我會堅持一個項目的方法,以免混淆不同風格的其他開發人員。

print test+" World"是最有效的,性能明智的,但給你的最低金額的靈活性

print "%s World" % test #Prints 'Hello World'基本上是像C的sprintf這確實串插。 我喜歡使用這個方法很多,因爲你不僅可以傳入一個常規字符串,而且還可以傳入一個字典。

print "Good morning %(name), there are %(count)d new articles in %(topic)s today. Would you like to <a href='%(url)s'>read them</a>?" % values

我沒有用過"{} World".format(test)個人。

在實際應用中,這些方法之間的性能差異是微不足道的,它實際上是遵循風格而不是過度編碼。

1

據我所知,第三項已被棄用的第一項,如python文檔中所述。它在Python 3.x和更高版本中被刪除。第二個實際上是兩個語句,一個字符串連接和一個字符串的打印語句。

更新:

看來我的信息是有點過。來自what's new in python 3.0頁面:

PEP 3101:高級字符串格式。注意:2.6說明 提到了8位和Unicode字符串的format()方法。在 3.0中,只有str類型(支持Unicode的文本字符串)支持 這種方法;字節類型不。該計劃最終將使 成爲字符串格式化的唯一API,並開始在Python 3.1中棄用 %運算符。

+3

「%s」%x在Python中未被刪除3,也許永遠不會。 –

8

小基準:

>>> a = lambda: "{} World".format("Hello") 
>>> b = lambda: "Hello" + " World" 
>>> c = lambda: "%s World" % "Hello" 
>>> d = lambda: "".join(("Hello", " World")) 
>>> a(), b(), c(), d() 
('Hello World', 'Hello World', 'Hello World', 'Hello World') 
>>> timeit.timeit(a) 
0.7830071449279785 
>>> timeit.timeit(b) 
0.18782711029052734 
>>> timeit.timeit(c) 
0.18806695938110352 
>>> timeit.timeit(d) 
0.3966488838195801 

好像b和c是最快的,之後d,一個令人驚訝的是一個最慢。

但是,如果你不做很多處理,使用哪一個並不重要,只是最好不要混合它們。

我個人更喜歡"".join只是簡單的concentenations,和str.format放置值,如"Hello, my name is {}.".format(name)

有傳聞稱%格式化將在Python 3中被棄用和刪除,但它沒有。

+2

這是非常誤導。您的結論僅適用於少量的短字符串,不適用於字符串以外的字符串,更長的字符串或更多字符串。隨着子串的數量和長度的變化,相對速度也會發生變化,特別是隨着串變得越來越長或越來越多,'b'越來越慢。另外,'b'和'd'需要你連接的任何字符串,而'a'和'c'則不需要。雖然'a'和'c'大致相似,'a'是最強大的。 – agf

+0

timeit.timeit包含什麼包?我看着Pypi,但找不到任何東西,它看起來很有用 – Smudge

+0

@samarudge,timeit :)。只是'進口時間; timeit.timeit(...)' – utdemir