Wenn ich zwei Listen habe, jede 800 Elemente lang und mit ganzen Zahlen gefüllt. Gibt es einen schnelleren Weg zu vergleichen, dass sie genau dieselben Elemente haben (und einen Kurzschluss, wenn sie das nicht haben), als wenn sie den eingebauten Operator ==
benutzen?
Besser als das?
Ich bin nur neugierig, weil ich eine riesige Liste von zu vergleichenden Listen habe.
Lassen Sie uns nicht annehmen, aber führen Sie einige Tests durch!
Die Einrichtung:
%Vor%Zwei riesige gleiche Listen:
%Vor%Zwei riesige Listen, in denen das erste Element nicht gleich ist:
%Vor%So scheint es, dass der eingebaute Listen-Gleichheitsoperator tatsächlich den Kurzschluss ausführt.
EDIT: Interessanterweise macht es das array.array
Modul nicht schneller:
numpy
bringt Ihnen jedoch eine gute Beschleunigung:
Numpy kann das 10-fache beschleunigen und ist besonders relevant, da Ihre Listen korrigiert sind ( Ganzzahl) type.
In reinem Python muss jeder Vergleich einem Verweis auf die nächsten Elemente folgen, die Typen usw. überprüfen. In numpy muss nur ein Zeiger inkrementiert werden.
Hier ist ein Vergleich:
%Vor%Und das Ergebnis ist 10x schneller mit numpy:
%Vor%Die eingebauten Funktionen von CPython (von denen ich annehme, dass Sie sie verwenden) werden in C geschrieben. Sie werden also nicht viel schneller als das, wenn Sie C / C ++ Code schreiben, der einen Teil Ihres Kontexts ausnutzt.
Nein, es gibt keine Möglichkeit, den Vergleich zu machen, wenn zwei Listen schneller sind. Aber Sie sagen, Sie haben eine riesige Liste von Listen. Und das klingt, als ob du die falsche Frage stellst. Und wenn wir annehmen, dass das, was Sie wollen, darin besteht, welche Listen in Ihrer Liste von Listen die gleichen sind, dann gibt es einen schnelleren Weg, dies zu tun:
%Vor% Wie Sie hier sehen, mache ich einen Hash aus jeder Liste (ich muss sie zuerst zu Tupeln machen, weil Listen nicht hashbar sind). Dann ist der Vergleich trivial, da Sie jetzt nur eine Liste von Ganzzahlen anstelle einer Liste von Listen haben. Wenn Ihnen die Reihenfolge der Elemente in der Liste nicht wichtig ist, verwenden Sie stattdessen hash(set(x))
.
Dies ist viel schneller, wenn Sie viele lange Listen haben und Sie alle Listen mit allen anderen Listen vergleichen.
Es gibt keinen Weg. Der einzige Weg zu wissen, ob zwei Elemente gleich sind, besteht darin, sie zu vergleichen, und Sie müssen alle Paare vergleichen, um zu wissen, ob sie gleich sind.
Das heißt, Sie können eine Beschleunigung sowieso bekommen. Wenn Sie NumPy-ND-Arrays richtig verwenden, kann NumPy nicht nur Ihre Vergleiche beschleunigen, sondern so ziemlich alles, was Sie sonst noch mit Ihren Daten tun. Alternativ können Sie, wenn Sie externe Informationen verwenden oder eine Beziehung zwischen der Gleichheit eines Listenpaars und einem anderen Paar haben, diese Informationen möglicherweise ausnutzen, um einen Teil der Vergleichsarbeit zu vermeiden.
Tags und Links python