2016-08-16 6 views
-1

文字列の連結:str + strまたは "{:s} {:s}"。

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に割り当てます。

確かに、Pythonはコンパイル時に"foobar"のリテラルを作成しますが、str = "foo" + "bar"の割り当ては高速になります。

読みやすさの面からは?また、str = "foo" + "bar"は確かにより明確で簡潔です。


両方のあなたの例では、共通の正誤表を使用すると、ビルトインされた名前strに代入しているということですので、あなたはそれを隠していません。 @Jim説明を完了するために、

+0

私は 'str'が組み込まれていることを知っています。単に名前として使用していました。変更されます。 – socrates

+0

@socratesはそれを避け、あなたの人生で必要としない厄介な状況につながる可能性があります:-) –

1

、ここでは両方の方法との比較を示す小さなベンチマークだ:

# 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) 

私のラップトップの結果が得られます。F1 = 4.49492255239sとf2 =の47.5562411453sを

ので、結論は、Nが大きいときには形式を使用しているため、より単純なstr連結バージョンを使用するよりもはるかに遅くなります。

+0

これは 'timeit'の奇妙な使い方です。ループを測定に入れて、一度だけ実行します。 'f1'の場合、ループのコストは、その結果が無意味になるまで時間をかけようとしているラインのコストよりもはるかに大きくなります。 'timeit( 'value =" foo "+" bar "')'はより標準的な方法です。 – tdelaney

0

よろしくお願いします。ジムの答えは、多くの文字列を持つ+演算子を使用すると遅くなる可能性があります。このような何かをやって

避けてください:

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

+=操作は、新しい文字列を作成します。これを避けるには、join()を使用してください。

' '.join(parts) 

この例では、+を使用する必要はありません。単純に+を使わずに隣り合って配置してください。

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} ")フォーマット(" foo "、" bar ")') '。 –

関連する問題