1. ホーム
  2. python

[解決済み] Pythonで文字列を連結する方法として好ましいのはどれですか?

2022-03-24 21:31:53

質問

Pythonの string を変更することができないので、どうすればより効率的に文字列を連結することができるのでしょうか?

それっぽく書けるんです。

s += stringfromelsewhere

とか、こんな感じです。

s = []

s.append(somestring)
    
# later
    
s = ''.join(s)

この質問を書いているときに、このトピックについて話している良い記事を見つけました。

http://www.skymind.com/~ocrow/python_string/

しかし、これはPython 2.xでの話なので、問題はPython 3で何かが変わったかどうかということです。

どのように解決するのですか?

その ベスト 文字列変数に文字列を追加する方法としては + または += . これは、読みやすく、速いからです。これらも同じように速く、どちらを選ぶかは好みの問題で、後者の方が一般的です。以下は timeit モジュールを使用します。

a = a + b:
0.11338996887207031
a += b:
0.11040496826171875

しかし、リストを持っていて、リストに文字列を追加し、それらのリストを結合することを推奨する人たちは、文字列を拡張することに比べて、リストに文字列を追加することが非常に速いからそうしているのだと思われます。そして、これは場合によっては正しいかもしれません。たとえば、次のような例があります。 1文字の文字列を、まず文字列に、次にリストに、100万回追加します。

a += b:
0.10780501365661621
a.append(b):
0.1123361587524414

OK、結果の文字列が100万文字になったとしても、追加する方が速いことがわかりました。

では、1000文字の文字列を10万回追加してみましょう。

a += b:
0.41823482513427734
a.append(b):
0.010656118392944336

そのため、最終的な文字列は約100MBの長さになります。これはかなり遅い。リストへのアペンドはもっと速かった。このタイミングには、最後の a.join() . では、どれくらいの時間がかかるのでしょうか?

a.join(a):
0.43739795684814453

おーぷす。この場合でも、append/joinの方が遅いことが判明しました。

では、この推奨はどこから来ているのでしょうか?Python2か?

a += b:
0.165287017822
a.append(b):
0.0132720470428
a.join(a):
0.114929914474

さて、append/joinは わずかながら 極端に長い文字列を使用している場合(通常はそうではありません。メモリが100MBもある文字列はどうでしょう?)、そこそこ高速になります。

しかし、本当に決定的なのはPython 2.3です。まだ終わっていないほど遅いので、タイミングも見せないところ。これらのテストは、突然 . ただし、append/joinはそれ以降のPythonと同じように高速です。

うん。石器時代のPythonでは、文字列の連結はとても遅かったんだ。しかし、2.4ではもうそうではないので(少なくともPython 2.4.7)、append/joinを使うという推奨は、Python 2.3が更新されなくなった2008年には古くなっており、あなたはそれを使うのを止めるべきでした:-).

(更新: もっと慎重にテストを行ったところ ++= は、Python 2.3でも2つの文字列に対してより高速です。を使うことを推奨しています。 ''.join() は誤解に違いない)

しかし、これはCPythonの話です。他の実装では別の懸念があるかもしれません。そしてこれは、早まった最適化が諸悪の根源であるもう一つの理由です。そして、これは、早まった最適化がすべての悪の根源であるもう一つの理由です。

したがって、文字列の連結を行うための "best" バージョンは、+ または += を使用することです。 . そして、それがあなたにとって遅いと判明した場合(かなり低い可能性ですが)、他のことを行ってください。

では、なぜ私は自分のコードでappend/joinを多用するのでしょうか?それは、その方が実際に明確な場合があるからです。特に、連結するものがスペースやカンマ、改行で区切られている場合はそうです。