Set vs. frozenset performance
Ich bastelte an Pythons @ herset
undfrozenset
Sammlungstypen.
nfangs nahm ich an, dassfrozenset
bietet eine bessere Suchleistung alsset
, da es unveränderlich ist und somit die Struktur der gespeicherten Elemente ausnutzen könnte.
Dies scheint jedoch in Bezug auf das folgende Experiment nicht der Fall zu sein:
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)
Ich habe diesen Code sowohl mit CPython als auch mit PyPy ausgeführt, was zu folgenden Ergebnissen führte:
> pypy set.py 100000000
set : 6.156
frozenset: 6.166
> python set.py 100000000
set : 16.824
frozenset: 17.248
Es scheint, dassfrozenset
ist in Bezug auf die Suchleistung langsamer, sowohl in CPython als auch in PyPy. Hat jemand eine Idee, warum dies der Fall ist? Ich habe mir die Implementierungen nicht angesehen.