私は、Pythonのset
とfrozenset
のコレクションタイプを手直ししていました。frozensetの性能との比較
当初は、frozenset
は、set
よりも優れた検索パフォーマンスを提供すると仮定していましたが、これは変更不可能であり、したがって保存されたアイテムの構造を悪用する可能性があります。
> pypy set.py 100000000
set : 6.156
frozenset: 6.166
> python set.py 100000000
set : 16.824
frozenset: 17.248
:私は以下の結果を与えはCPythonとPyPyの両方を使用してこのコードを、実行
import random
import time
import sys
def main(n):
numbers = []
for _ in xrange(n):
numbers.append(random.randint(0, sys.maxint))
set_ = set(numbers)
frozenset_ = frozenset(set_)
start = time.time()
for number in numbers:
number in set_
set_duration = time.time() - start
start = time.time()
for number in numbers:
number in frozenset_
frozenset_duration = time.time() - start
print "set : %.3f" % set_duration
print "frozenset: %.3f" % frozenset_duration
if __name__ == "__main__":
n = int(sys.argv[1])
main(n)
:
しかし、これは以下の実験に関しては、ケースであるようには見えません実際にはfrozenset
はCPythonとPyPyの両方でルックアップのパフォーマンスが遅くなっているようです。なぜこれが当てはまるのか誰もが知っていますか?私は実装を調べなかった。
を「と
てみませんセット内の1つの
numbers
からの値と1で、timeit
module使ってテストを実行するにはその不変なので、保存されたアイテムの構造を悪用する可能性があります。アクセスできる構造体であれば 'set'もあります。 – user2357112これは私が求めていることです。 私は、frozensetがある種の事前計算されたハッシュ関数を使用する可能性があり、その結果、より良い検索パフォーマンスを得ることができると考えました。 –
ルックアップする項目のハッシュを計算する必要があります。任意のアイテムをセットに対してテストできるので、ここではハッシュをあらかじめ計算することはできません。私はこの最適化をどのように描いているのかよく分かりません。アイテム*は、ハッシュを計算する必要はありません。それらはすでにハッシュテーブルに入れられています。 –