2 つの文字列の長さが長くなるにつれて比較が遅くなるかどうかを評価しようとしています。私の計算では、文字列の比較には償却定数時間がかかるはずですが、私の Python 実験では奇妙な結果が得られます。
これはミリ秒単位の時間に対する文字列の長さ (1 から 400) のプロットです。自動ガベージ コレクションは無効になっており、gc.collect
反復ごとに実行されます。
毎回 100 万個のランダムな文字列を比較し、次のように一致を数えます。このプロセスは、測定されたすべての時間の最小値を取る前に 50 回繰り返されます。
for index in range(COUNT):
if v1[index] == v2[index]:
matches += 1
else:
non_matches += 1
長さが 64 付近で急激に増加した理由は何ですか?
注: 次のスニペットを使用して、が長さのランダムな文字列の 2 つのリストであり、COUNT がそれらの長さであると仮定v1
して、問題の再現を試みることができます。v2
n
timeit.timeit("for i in range(COUNT): v1[i] == v2[i]",
"from __main__ import COUNT, v1, v2", number=50)
さらに注意: 私は 2 つの追加のテストを行いました:問題を完全is
に抑制するのではなく文字列を比較する==
と、パフォーマンスは約 210ms/1M の比較になります。インターンが言及されたので、各文字列の後に必ず空白を追加しました。これにより、インターンを防ぐことができます。それは何も変わりません。では、インターン以外の何かですか?