[解決済み] Pythonで文字列を連結する方法として好ましいのはどれですか?
質問
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を多用するのでしょうか?それは、その方が実際に明確な場合があるからです。特に、連結するものがスペースやカンマ、改行で区切られている場合はそうです。
関連
-
[解決済み] データ型が理解できない
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] Pythonで文字列の部分文字列を取得するにはどうすればよいですか?
-
[解決済み] Pythonで文字列を小文字にするには?
-
[解決済み] Python 3で文字列をバイトに変換する最良の方法?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
PythonによるLeNetネットワークモデルの学習と予測
-
ピロウズ画像色処理の具体的な活用方法
-
ピローによる動的キャプチャ認識のためのPythonサンプルコード
-
PicgoのイメージベッドツールをPythonで実装する
-
Pythonショートビデオクローラーチュートリアル
-
[解決済み】RuntimeWarning: 割り算で無効な値が発生しました。
-
[解決済み】OSError: [WinError 193] %1 は有効な Win32 アプリケーションではありません。
-
[解決済み】csv.Error:イテレータはバイトではなく文字列を返すべき
-
[解決済み】syntaxError: 'continue' がループ内で適切に使用されていない
-
[解決済み】文字列フラグ "u "と "r "は一体何をするのでしょうか、そして生の文字列リテラルとは何でしょうか?