ホームページ  >  記事  >  バックエンド開発  >  Python の文字列連結はどのくらい効率的ですか?いつ最適化されますか?

Python の文字列連結はどのくらい効率的ですか?いつ最適化されますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-01 00:27:29984ブラウズ

 How Efficient Is Python's String Concatenation, and When Does It Optimize?

Python で文字列を別の文字列に効率的に追加するにはどうすればよいですか?

文字列を別の文字列に追加する場合、次のようにすると効率的です。特に複数の連結があるシナリオの場合、操作を最適化します。質問で説明されている従来の方法 var3 = var1 var2 は、必ずしも最も効率的であるとは限りません。

CPython 最適化

CPython、Python のデフォルト実装。は、初期文字列への参照が 1 つだけ存在する場合に、文字列連結に特定の最適化を採用します。この最適化では文字列を適切に拡張しようとするため、償却された O(n) 操作が発生します。これは、以前は O(n^2) だった

s = ""
for i in range(n):
    s += str(i)

のようなシナリオが、O(n) と大幅に高速化されたことを意味します。

実装の詳細< /h3>

CPython の最適化は、bytesobject.c 内の _PyBytes_Resize 関数に実装されています。文字列オブジェクトのメモリを再割り当てし、指定された量だけサイズを増やします。成功すると、文字列のサイズが更新され、文字列を終了するために末尾の null バイトが設定されます。

gt;経験的検証

この最適化を経験的に実証するには、次のことを考慮してください。 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。