回答:
1対1の相関関係はありません。本当に良い記事については、Pythonでの効率的な文字列連結を参照してください。
Pythonプログラミング言語で長い文字列を作成すると、コードの実行が非常に遅くなることがあります。この記事では、さまざまな文字列連結方法の計算パフォーマンスを調査します。
私はOliver Crow(Andrew Hareから提供されたリンク)のコードを使用し、Python 2.7.3を調整するために少し調整しました。(timeitパッケージを使用)。私は自分のパソコン、Lenovo T61、6GB RAM、Debian GNU / Linux 6.0.6(squeeze)で走りました。
10,000回の反復の結果は次のとおりです。
方法1:0.0538418292999秒 プロセスサイズ4800 kb method2:0.22602891922秒 プロセスサイズ4960 kb method3:0.0605459213257秒 プロセスサイズ4980 kb method4:0.0544030666351秒 プロセスサイズ5536 kb method5:0.0551080703735秒 プロセスサイズ5272 kb method6:0.0542731285095秒 プロセスサイズ5512 kb
そして5,000,000回の繰り返し(方法2は、永久に実行されるのと同じくらいゆっくり実行されたため、無視されました):
method1:5.88603997231秒 プロセスサイズ37976 kb method3:8.40748500824秒 プロセスサイズ38024 kb method4:7.96380496025秒 プロセスサイズ321968 kb method5:8.03666186333秒 プロセスサイズ71720 kb method6:6.68192911148秒 プロセスサイズ38240 kb
Hoareが言ったように、Pythonの連中が文字列の連結を最適化するためにかなり素晴らしい仕事をしたことは明らかです。「早期の最適化はすべての悪の根源です」
コンパイラの最適化に依存することは脆弱です。受け入れられた回答にリンクされているベンチマークと、Antoine-tranによって与えられた数値は信頼されるべきものではありません。Andrew Hareは、repr
自分のメソッドに呼び出しを含めるという間違いを犯しています。これにより、すべてのメソッドが同等に遅くなりますが、文字列を作成する際の実際のペナルティがわかりにくくなります。
を使用しjoin
ます。非常に高速で堅牢です。
$ ipython3
Python 3.5.1 (default, Mar 2 2016, 03:38:02)
IPython 4.1.2 -- An enhanced Interactive Python.
In [1]: values = [str(num) for num in range(int(1e3))]
In [2]: %%timeit
...: ''.join(values)
...:
100000 loops, best of 3: 7.37 µs per loop
In [3]: %%timeit
...: result = ''
...: for value in values:
...: result += value
...:
10000 loops, best of 3: 82.8 µs per loop
In [4]: import io
In [5]: %%timeit
...: writer = io.StringIO()
...: for value in values:
...: writer.write(value)
...: writer.getvalue()
...:
10000 loops, best of 3: 81.8 µs per loop
repr
呼び出しはランタイムを支配しますが、間違いを個人的なものにする必要はありません。
Pythonには、同様の目的を満たすいくつかの機能があります。
list(your_string)
。UserString.MutableString
これにa を使用することもできます。(c)StringIO.StringIO
それ以外の場合はファイルを取得することには役立ちますが、一般的な文字列の構築にはそれほど役立ちません。上記の方法5(疑似ファイル)を使用すると、非常に優れたパフォーマンスと柔軟性を得ることができます
from cStringIO import StringIO
class StringBuilder:
_file_str = None
def __init__(self):
self._file_str = StringIO()
def Append(self, str):
self._file_str.write(str)
def __str__(self):
return self._file_str.getvalue()
今それを使っています
sb = StringBuilder()
sb.Append("Hello\n")
sb.Append("World")
print sb
明確な類似物はありません-文字列の連結(前述のように最適化されている可能性が高い)またはサードパーティのクラス(それらの方がはるかに効率的であることを疑っています)-Pythonのリストは動的に型付けされているため、高速に機能しませんchar [](私が想定するバッファ)。Stringbuilderに似たクラスは、多くの言語の文字列に固有の機能(不変性)があるため、時期尚早の最適化ではありません。これにより、多くの最適化が可能になります(たとえば、スライス/サブストリングの同じバッファーの参照)。文字列ビルダー/文字列バッファー/文字列ストリームのようなクラスは、文字列の連結(割り当てとガベージコレクションを必要とする多くの小さな一時オブジェクトを生成する)や、文字列フォーマットのprintfのようなツールでさえ、かなり高速に動作します。多くのフォーマット呼び出し。
ここでPythonの高速文字列連結メソッドを探している場合は、特別なStringBuilderクラスは必要ありません。単純な連結は、C#で見られるようなパフォーマンスの低下なしに、同様に機能します。
resultString = ""
resultString += "Append 1"
resultString += "Append 2"
パフォーマンスの結果については、Antoine-tranの回答を参照してください