文字列を別の文字列に追加する場合、次のようにすると効率的です。特に複数の連結があるシナリオの場合、操作を最適化します。質問で説明されている従来の方法 var3 = var1 var2 は、必ずしも最も効率的であるとは限りません。
CPython、Python のデフォルト実装。は、初期文字列への参照が 1 つだけ存在する場合に、文字列連結に特定の最適化を採用します。この最適化では文字列を適切に拡張しようとするため、償却された O(n) 操作が発生します。これは、以前は O(n^2) だった
s = "" for i in range(n): s += str(i)
のようなシナリオが、O(n) と大幅に高速化されたことを意味します。
CPython の最適化は、bytesobject.c 内の _PyBytes_Resize 関数に実装されています。文字列オブジェクトのメモリを再割り当てし、指定された量だけサイズを増やします。成功すると、文字列のサイズが更新され、文字列を終了するために末尾の null バイトが設定されます。
この最適化を経験的に実証するには、次のことを考慮してください。 timeit の結果:
$ python -m timeit -s"s=''" "for i in xrange(10):s+='a'" 1000000 loops, best of 3: 1.85 usec per loop $ python -m timeit -s"s=''" "for i in xrange(100):s+='a'" 10000 loops, best of 3: 16.8 usec per loop $ python -m timeit -s"s=''" "for i in xrange(1000):s+='a'" 10000 loops, best of 3: 158 usec per loop $ python -m timeit -s"s=''" "for i in xrange(10000):s+='a'" 1000 loops, best of 3: 1.71 msec per loop $ python -m timeit -s"s=''" "for i in xrange(100000):s+='a'" 10 loops, best of 3: 14.6 msec per loop $ python -m timeit -s"s=''" "for i in xrange(1000000):s+='a'" 10 loops, best of 3: 173 msec per loop
文字列が小さい場合、オーバーヘッドは最小限ですが、文字列のサイズが大きくなるにつれて、最適化されたアプローチの効率が大幅に向上します。
この最適化は Python 仕様の一部ではないことに注意することが重要です。これは CPython の特定の実装の詳細であり、PyPy や Jython などの他の Python 実装には存在しない可能性があります。
以上がPython の文字列連結はどのくらい効率的ですか?いつ最適化されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。