文字列変数に文字列を追加する最良の方法は、 +
orを使用すること+=
です。これは、読みやすく高速であるためです。どちらを選択するかは好みの問題ですが、後者が最も一般的です。timeit
モジュールのタイミングは次のとおりです。
a = a + b:
0.11338996887207031
a += b:
0.11040496826171875
ただし、リストを作成してそれらに追加し、それらのリストに結合することを推奨する人は、リストに文字列を追加する方が文字列を拡張するよりもおそらく非常に高速であるため、そうします。そして、これは場合によっては真実です。たとえば、1 文字の文字列を最初に文字列に追加し、次にリストに追加する 100 万回を次に示します。
a += b:
0.10780501365661621
a.append(b):
0.1123361587524414
OK、結果の文字列が 100 万文字の長さであっても、追加の方が高速であることがわかりました。
それでは、1,000 文字の長い文字列を 10 万回追加してみましょう。
a += b:
0.41823482513427734
a.append(b):
0.010656118392944336
したがって、最後の文字列は約 100MB の長さになります。それはかなり遅かったのですが、リストへの追加ははるかに高速でした。そのタイミングには最終的なa.join()
. それで、それにはどれくらい時間がかかりますか?
a.join(a):
0.43739795684814453
おっと。この場合でも、追加/結合は遅くなります。
では、この推奨事項はどこから来たのでしょうか。パイソン2?
a += b:
0.165287017822
a.append(b):
0.0132720470428
a.join(a):
0.114929914474
非常に長い文字列を使用している場合、追加/結合はわずかに高速です (通常はそうではありません。メモリに 100MB の文字列があるとしたらどうでしょうか?)
しかし、本当の決め手は Python 2.3 です。まだ終わっていないほど遅いので、タイミングを示すことさえしません。これらのテストには突然数分かかります。追加/結合を除いて、これは後のPythonと同じくらい高速です。
うん。石器時代の Python では、文字列の連結は非常に遅かったです。しかし、2.4 ではもう (または少なくとも Python 2.4.7 では) そうではありません。そのため、Python 2.3 の更新が停止された 2008 年に追加/結合を使用するという推奨事項は時代遅れになり、使用を停止する必要がありました。:-)
(更新: Python 2.3 で 2 つの文字列を使用するよりも慎重にテストを行ったところ、より高速+
であることがわかりました。使用することをお勧めするのは誤解である必要があります)+=
''.join()
ただし、これは CPython です。他の実装には他の問題があるかもしれません。これが、時期尚早の最適化が諸悪の根源であるもう 1 つの理由です。最初に測定しない限り、「より速い」と思われる手法を使用しないでください。
したがって、文字列連結を行うための「最良の」バージョンは、 + または += を使用することです。そして、それが遅いことが判明した場合は (ほとんどありそうにありません)、別のことをしてください。
では、なぜコードで多くの追加/結合を使用するのでしょうか? 時々、実際にはより明確になるからです。特に、連結する必要があるものをスペース、コンマ、または改行で区切る必要がある場合。