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.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage