Gibt es einen schnelleren Weg zu testen, ob zwei Listen die gleichen Elemente haben wie Pythons? == operator?

8

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?

%Vor%

Besser als das?

Ich bin nur neugierig, weil ich eine riesige Liste von zu vergleichenden Listen habe.

    
Zack Yoshyaro 23.08.2013, 19:53
quelle

7 Antworten

10

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:

%Vor%

numpy bringt Ihnen jedoch eine gute Beschleunigung:

%Vor%     
Claudiu 23.08.2013, 20:00
quelle
4

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%     
tom10 23.08.2013 20:00
quelle
3

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.

    
Paul Evans 23.08.2013 19:56
quelle
3

Eine andere Möglichkeit ist pypy :

%Vor%

Und pypy führt 10x schneller für diese Eingabe aus.

    
alecxe 23.08.2013 20:09
quelle
2

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)) .

%Vor%

Dies ist viel schneller, wenn Sie viele lange Listen haben und Sie alle Listen mit allen anderen Listen vergleichen.

    
Lennart Regebro 23.08.2013 20:13
quelle
1

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.

    
user2357112 23.08.2013 20:01
quelle
0

Je nach Anwendungsfall können Sie Tupel verwenden (die nicht veränderbar sind) und die Listen in ein Set einfügen.

Ihre andere Möglichkeit besteht darin, bei der Erstellung der Listen die Ähnlichkeit zu verfolgen (oder nicht).

    
Marcin 23.08.2013 20:12
quelle

Tags und Links