Leistung Set vs.

7

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.

    
Sven Hager 11.04.2016, 17:21
quelle

1 Antwort

28

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:

%Vor%

Dies wiederholt jeden Test 1 Million Mal und erzeugt:

%Vor%     
Martijn Pieters 11.04.2016, 17:55
quelle

Tags und Links