Python はstring
変更できないので、文字列をより効率的に連結するにはどうすればいいか疑問に思っています。
次のように書くこともできます:
s += stringfromelsewhere
または次のようになります:
s = []
s.append(somestring)
# later
s = ''.join(s)
この質問を書いている間に、このトピックについて語っている良い記事を見つけました。
http://www.skymind.com/~ocrow/python_string/
しかし、これは Python 2.x なので、Python 3 で何か変更があったかどうかが疑問になります。
ベストアンサー1
文字列変数に文字列を追加する最良の方法は、 または を使用することです。これ+
は+=
、読みやすく、高速だからです。どちらも同様に高速ですが、どちらを選択するかは好みの問題です。後者が最も一般的です。モジュールでのタイミングは次のとおりですtimeit
。
a = a + b:
0.11338996887207031
a += b:
0.11040496826171875
しかし、リストを用意して、そこに文字列を追加し、それらのリストを結合することを推奨する人たちは、文字列をリストに追加する方が文字列を拡張するよりもおそらく非常に高速であると考えているようです。そして、これは場合によっては真実です。たとえば、以下は 1 文字の文字列を最初に文字列に追加し、次にリストに追加した 100 万回の例です。
a += b:
0.10780501365661621
a.append(b):
0.1123361587524414
結果の文字列が 100 万文字の長さであっても、追加のほうが高速であることがわかりました。
次に、1,000 文字の文字列を 10 万回追加してみましょう。
a += b:
0.41823482513427734
a.append(b):
0.010656118392944336
したがって、最後の文字列の長さは約 100 MB になります。これはかなり遅いですが、リストに追加する方がはるかに高速です。この時間には最後のは含まれていませんa.join()
。では、どれくらいの時間がかかりますか?
a.join(a):
0.43739795684814453
おっと。この場合でも、追加/結合は遅くなることがわかりました。
では、この推奨はどこから来たのでしょうか? Python 2 でしょうか?
a += b:
0.165287017822
a.append(b):
0.0132720470428
a.join(a):
0.114929914474
非常に長い文字列を使用している場合、追加/結合はわずかに高速になります (通常はそうではありませんが、メモリ内に 100 MB の文字列があるとどうなるでしょうか)。
しかし、本当の決め手は Python 2.3 です。ここでは、まだ完了していないほど遅いため、タイミングを示すことすらしません。これらのテストには突然数分かかります。追加/結合を除いて、これは後の Python と同じくらい高速です。
はい。石器時代の Python では、文字列の連結は非常に遅かったです。しかし、2.4 ではもう遅くありません (少なくとも Python 2.4.7 では)。そのため、append/join を使用するという推奨は、Python 2.3 の更新が停止した 2008 年に時代遅れになり、使用をやめるべきでした。:-)
(更新: より慎重にテストを行ったところ、Python 2.3 でも 2 つの文字列の場合は を使用する方が高速であることがわかりました。 を使用するように推奨されている+
のは誤解であるに違いありません)+=
''.join()
ただし、これは CPython です。他の実装では別の懸念があるかもしれません。そして、これは、早すぎる最適化が諸悪の根源である理由の 1 つにすぎません。最初に測定しない限り、「より高速」であるとされる手法を使用しないでください。
したがって、文字列連結を行うための「最良」のバージョンは、 + または += を使用することです。そして、それがあなたにとって遅いことが判明した場合 (それはほとんどあり得ないことですが)、別の方法を試してください。
では、なぜコード内で追加/結合を多用するのでしょうか? それは、その方が実際にわかりやすい場合があるからです。特に、連結するものをスペースやカンマ、改行で区切る必要がある場合はそうです。