2011-08-05 22 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' 

性能、互換性、および一般的な好みの点で、これらの方法の相違点は何か(もしあれば)です。オープンソースプロジェクト間でも、3つの方法はすべて同じ意味で使われているようです。

+1

なぜあなたはパフォーマンスについて心配しますか?印刷ステートメントの?あなたはどれくらい印刷しますか?ハハ。彼らはまったく同じです。どんな作品であれ使用してください。 – john

+2

@awfullyjohn私は実用的なものより理論的な質問のほうが多いと思いますが、私はちょっと興味があったのですが、別の方法の裏に歴史があったら – Smudge

+0

http://www.codinghorror.com/blog/2009/01/the-悲しい - 悲劇的な - 悲劇 - マイクロ - 最適化 - theater.htmlこのトピック(PythonとC#は、文字列の同様の実装を持っているので、結論が均等に適用されるので、このトピックのパフォーマンスについてのあなたの懸念のために) – SingleNegationElimination

答えて

8

前述のとおり、さまざまなオープンソースプロジェクトでは、これらのすべてのメソッドを文字列の書式設定に使用します。しかし、異なるスタイルの他の開発者を混同しないように、私は1つのプロジェクトの1つの方法に固執します。

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

私が知る限り、第3のアイテムはpythonのドキュメントで説明されているように最初のアイテムでは非難されています。 Python 3.x以降では削除されています。 2番目のステートメントは実際には2つのステートメントで、文字列の連結と文字列のprintステートメントです。

更新:

私の情報は多少残っているようです。 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を、"Hello, my name is {}.".format(name)の場合は値を配置するstr.formatを好みます。

%のフォーマットはPython 3では廃止され、削除されるという噂がありましたが、そうではありませんでした。

+2

これは非常に誤解を招くことです。結論は短い文字列にのみ適用され、文字列、長い文字列、またはそれ以上の文字列以外のものには適用されません。部分文字列の数と長さが変化すると、相対的な速度が変化します。特に、文字列の長さや長さが増えると「b」が遅くなります。また、 'b'と' d'は文字列に連結するものを必要とし、 'a'と' c'は文字列ではありません。 'a'と' c'はほぼ同じですが、 'a'が最も強力です。 – agf

+0

どのパッケージがtimeit.timeitにありますか?私はピピを見ても何も見つけられませんでした。それは役に立ちます – Smudge

+0

@samarudge、timeit :)ちょうど 'import timeit; timeit.timeit(...) ' – utdemir