Ich habe mit Pythons% collection-Typen set
und frozenset
herumgebastelt.
Zunächst nahm ich an, dass frozenset
eine bessere Lookup-Leistung als set
bietet, 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:
%Vor%Ich habe diesen Code sowohl mit CPython als auch mit PyPy ausgeführt, was zu folgenden Ergebnissen führte:
%Vor% Es scheint, dass frozenset
in Bezug auf die Suchleistung sowohl in CPython als auch in PyPy langsamer ist. Hat jemand eine Idee, warum das so ist? Ich habe die Implementierungen nicht untersucht.
Die Implementierungen frozenset
und set
werden weitgehend gemeinsam genutzt. a set
ist einfach ein frozenset
mit hinzugefügten Mutationsmethoden, mit der exakt gleichen Hashtabellenimplementierung. Siehe die Objects/setobject.c
Quelldatei ; Die oberste PyFrozenSet_Type
-Definition teilt die Funktionen mit PySet_Type
Definition .
Hier gibt es keine Optimierung für ein eingefrorenes Set, da die Hashes für die Elemente in der frozenset
nicht berechnet werden müssen, wenn Sie die Mitgliedschaft testen. Für das Element, mit dem gegen getestet wird, muss der Hashwert noch berechnet werden, um den richtigen Slot in der festgelegten Hashtabelle zu finden, damit Sie einen Gleichheitstest durchführen können.
Daher sind Ihre Timing-Ergebnisse wahrscheinlich aufgrund anderer Prozesse auf Ihrem System deaktiviert. Sie haben die Wanduhrzeit gemessen und die Python-Speicherbereinigung nicht deaktiviert, noch haben Sie das gleiche wiederholt getestet.
Versuchen Sie, Ihren Test mit dem Modul timeit
auszuführen, mit einem Wert aus numbers
und eines nicht im Set:
Dies wiederholt jeden Test 1 Million Mal und erzeugt:
%Vor%Tags und Links python performance set frozenset