Macht es Sinn, in __eq__ nach Identität zu suchen?

8

Ist es beim Implementieren einer benutzerdefinierten Gleichheitsfunktion für eine Klasse sinnvoll, zuerst nach Identität zu suchen? Ein Beispiel:

%Vor%

Dies ist interessant für Fälle, in denen die anderen Kriterien teurer sein können (z. B. Vergleichen einiger langer Strings).

    
Björn Pollex 05.07.2010, 13:53
quelle

5 Antworten

3

necesarry: nein

macht es Sinn: sicher, warum nicht?

Eine solche Überprüfung wird standardmäßig nicht durchgeführt, wie Sie hier sehen können:

%Vor%     
Jochen Ritzel 05.07.2010, 13:59
quelle
7

Es kann eine vollkommen vernünftige Abkürzung sein, um zuerst nach Identität zu suchen, und in Gleichheitsmethoden sind gute Abkürzungen (sowohl für Gleichheit als auch für Nichtgleichheit), was Sie suchen sollten, damit Sie so bald wie möglich zurückkehren können.

Andererseits könnte es aber auch völlig überflüssig sein, wenn Ihr Test auf Gleichheit sonst billig ist und Sie in der Praxis kaum ein Objekt mit sich selbst vergleichen.

Wenn zum Beispiel die Gleichheit zwischen Objekten durch Vergleichen von ein oder zwei ganzen Zahlen gemessen werden kann, sollte dies schneller sein als der Identitätstest, also in weniger als der Zeit, die es dauern würde, um id s zu vergleichen Antworten. Und denken Sie daran, dass wenn Sie die Identitäten überprüfen und die Objekte nicht das gleiche id haben (was in den meisten Szenarien wahrscheinlich ist), dann haben Sie nichts gewonnen, da Sie immer noch den vollständigen Check durchführen müssen.

>

Wenn also eine vollständige Überprüfung der Gleichheit nicht billig ist und es möglich ist, dass ein Objekt mit sich selbst verglichen werden kann, dann kann die Überprüfung der Identität eine gute Idee sein.

Beachten Sie, dass ein anderer Grund, warum die Überprüfung nicht standardmäßig durchgeführt wird, ist, dass es ziemlich vernünftig (wenn auch selten) ist, Objekte mit identischen Identitäten als ungleich zu vergleichen, zum Beispiel:

%Vor%     
Scott Griffiths 05.07.2010 14:11
quelle
2

Wenn Sie benutzerdefinierte Gleichheit in einer Klasse implementieren, können Sie selbst entscheiden, ob Sie zuerst nach Identität suchen. Es liegt ganz bei Ihnen. Beachten Sie, dass es in Python auch vollkommen richtig ist zu entscheiden, dass __eq__ und __ne__ den gleichen Wert für ein gegebenes Argument zurückgeben; Es ist also möglich, Gleichheit zu definieren, so dass Identität keine Abkürzung ist.

Es ist sicherlich eine Geschwindigkeitsverbesserung, obwohl wie viel davon von der Komplexität der Methode abhängt. Im Allgemeinen störe ich nicht in meinen benutzerdefinierten Klassen, aber ich habe nicht viel Geschwindigkeitskritischen Code (und wo ich, Objektvergleiche sind nicht der Hotspot).

Für die meisten meiner Objekte sieht die Gleichheits-Methode folgendermaßen aus:

%Vor%

Ich könnte einfach einen if self is o: return True check am Anfang der Methode hinzufügen.

Denken Sie auch daran, __hash__ zu überschreiben, wenn Sie __eq__ überschreiben, oder Sie werden in set s und dict s seltsame Verhaltensweisen erhalten.

    
Chris B. 05.07.2010 14:15
quelle
1

Ich habe vor einigen Jahren eine ähnliche Frage zu comp.lang.python gestellt - hier ist der Thread . Die Schlussfolgerungen zu dieser Zeit waren, dass der Up-Front-Identitätstest es wert war, wenn Sie viele Tests für die Gleichheit von Objekten mit sich selbst durchgeführt haben oder wenn Ihre andere Logik für die Gleichheitsprüfung langsam war.

    
PaulMcG 05.07.2010 15:26
quelle
0

Dies geschieht nur aus Leistungsgründen.

Bei einem Programmierjob habe ich daran gearbeitet, in Java wurde das immer gemacht, obwohl es keine Funktionalität ändert.

    
Sjoerd 05.07.2010 14:00
quelle

Tags und Links