set
私は Pythonとfrozenset
コレクション型をいじっていました。
最初は、不変であり、保存されたアイテムの構造を利用できるため、 はfrozenset
よりも優れたルックアップ パフォーマンスを提供すると考えていました。set
ただし、次の実験に関しては、そうではないようです。
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)
CPython と PyPy の両方を使用してこのコードを実行したところ、次の結果が得られました。
> pypy set.py 100000000
set : 6.156
frozenset: 6.166
> python set.py 100000000
set : 16.824
frozenset: 17.248
frozenset
CPython と PyPy の両方で、ルックアップのパフォーマンスに関して実際には遅いようです。なぜこれが当てはまるのか、誰にも分かりますか?私は実装を調べませんでした。