Angenommen, ich habe eine if
Erklärung mit a return
. Aus Sicht der Effizienz sollte ich verwenden
if(A > B):
return A+1
return A-1
oder
if(A > B):
return A+1
else:
return A-1
Sollte ich die eine oder andere bevorzugen, wenn ich eine kompilierte Sprache (C) oder eine Skriptsprache (Python) verwende?
python
c
performance
compiler-construction
Jorge Leitao
quelle
quelle
Antworten:
Da die
return
Anweisung die Ausführung der aktuellen Funktion beendet, sind die beiden Formen äquivalent (obwohl die zweite wohl besser lesbar ist als die erste).Die Effizienz beider Formen ist vergleichbar, der zugrunde liegende Maschinencode muss einen Sprung ausführen, wenn die
if
Bedingung ohnehin falsch ist.Beachten Sie, dass Python eine Syntax unterstützt, mit der Sie
return
in Ihrem Fall nur eine Anweisung verwenden können:quelle
return (A>B)?A+1:A-1;
Es gibt jedoch absolut keinen Leistungsgewinn, wenn Sie den Code so schreiben. Alles, was wir erreicht haben, ist, den Code verschleiert, unlesbar und in einigen Fällen anfälliger für implizite Typwerbung zu machen.<
ist es eine schlechte Praxis, weil sie zu-1 < 1u
einem unerwarteten Ergebnis führt.-1 < 1u
, was ich bezweifle, würde er den Fehler leicht erkennen. Sehr viele Leute würden jedoch eine Version des Codes schreiben, den ich gepostet habe. Ich habe solche Fehler viel zu oft im Produktionscode gesehen, um dem Operator ?: Zu vertrauen. Als Faustregel gilt: Wenn die Sprache Ihnen zwei verschiedene Möglichkeiten bietet, dasselbe zu tun, verwenden Sie nur eine davon. Wählen Sie je nach Stimmung keine der beiden zufällig aus.Aus dem Chromium Style Guide:
Verwenden Sie nach der Rückkehr nichts anderes:
quelle
if-else-return
Zweige fast nie gleich sind (wenn dies der Fall ist, sollten Sie trotzdem ein Refactoring durchführen; entweder mit einemswitch
Konstrukt oder für Python, mit der Aufzählung eines Diktats / mit einem aufrufbaren / etc.). Daher handelt es sich bei fast allenif-else-return
Fällen um Schutzklauseln, und diese sind immer ohne den getesteten Ausdruck testbar (verspotten Sie den getesteten Ausdruck)else
.In Bezug auf den Codierungsstil:
Die meisten Codierungsstandards, unabhängig von der Sprache, verbieten mehrere Rückgabeanweisungen von einer einzelnen Funktion als schlechte Praxis.
(Obwohl ich persönlich sagen würde, dass es mehrere Fälle gibt, in denen mehrere return-Anweisungen sinnvoll sind: Text- / Datenprotokoll-Parser, Funktionen mit umfassender Fehlerbehandlung usw.)
Alle diese Kodierungsstandards der Branche sind sich einig, dass der Ausdruck wie folgt geschrieben werden sollte:
In Bezug auf die Effizienz:
Das obige Beispiel und die beiden Beispiele in der Frage sind alle hinsichtlich der Effizienz völlig gleichwertig . In all diesen Fällen muss der Maschinencode A> B vergleichen, dann entweder zur A + 1- oder zur A-1-Berechnung verzweigen und das Ergebnis in einem CPU-Register oder auf dem Stapel speichern.
EDIT:
Quellen:
quelle
return
wo immer es klar ist, ist es die idiomatische Methode, dies in Python zu tun.Bei jedem vernünftigen Compiler sollten Sie keinen Unterschied feststellen. Sie sollten zu identischem Maschinencode kompiliert werden, da sie gleichwertig sind.
quelle
Dies ist eine Frage des Stils (oder der Präferenz), da es dem Dolmetscher egal ist. Persönlich würde ich versuchen, nicht die endgültige Aussage einer Funktion zu machen, die einen Wert auf einer anderen Einrückungsebene als der Funktionsbasis zurückgibt. Das else in Beispiel 1 verdeckt, wenn auch nur geringfügig, wo sich das Ende der Funktion befindet.
Bevorzugt benutze ich:
Da es sowohl der guten Konvention entspricht, eine einzige return-Anweisung als letzte Anweisung in der Funktion zu haben (wie bereits erwähnt), als auch dem guten funktionalen Programmierparadigma, imperative Zwischenergebnisse zu vermeiden.
Bei komplexeren Funktionen ziehe ich es vor, die Funktion in mehrere Unterfunktionen zu unterteilen, um vorzeitige Rückgaben nach Möglichkeit zu vermeiden. Ansonsten verwende ich wieder eine imperative Stilvariable namens rval. Ich versuche, nicht mehrere return-Anweisungen zu verwenden, es sei denn, die Funktion ist trivial oder die return-Anweisung vor dem Ende ist auf einen Fehler zurückzuführen. Eine vorzeitige Rückkehr unterstreicht die Tatsache, dass Sie nicht weitermachen können. Für komplexe Funktionen, die in mehrere Unterfunktionen verzweigen sollen, versuche ich, sie als case-Anweisungen zu codieren (z. B. gesteuert durch ein Diktat).
Einige Plakate haben die Betriebsgeschwindigkeit erwähnt. Die Laufzeitgeschwindigkeit ist für mich zweitrangig, da Python nicht die beste Sprache ist, wenn Sie Ausführungsgeschwindigkeit benötigen. Ich benutze Python als die Effizienz der Codierung (dh das Schreiben von fehlerfreiem Code), die für mich wichtig ist.
quelle
var n = 1 if (A > B) else -1
return A+n
Ich persönlich vermeide
else
Blockaden, wenn möglich. Siehe die Anti-Wenn-KampagneAußerdem berechnen sie keine zusätzlichen Gebühren für die Leitung, wissen Sie: p
"Einfach ist besser als komplex" & "Lesbarkeit ist König"
quelle
dict
s zur Vermeidung von Unterschieden ist in Bezug auf die Leistung eine sehr schlechte Idee.Version A ist einfacher und deshalb würde ich es verwenden.
Wenn Sie alle Compiler-Warnungen in Java aktivieren, erhalten Sie eine Warnung für die zweite Version, da diese nicht erforderlich ist und die Codekomplexität erhöht.
quelle
Ich weiß, dass die Frage mit Python getaggt ist, aber sie erwähnt dynamische Sprachen, daher sollte ich erwähnen, dass die if-Anweisung in Ruby tatsächlich einen Rückgabetyp hat, damit Sie so etwas tun können
Oder weil es auch einfach implizite Rückkehr hat
Das umgeht das Stilproblem, nicht mehrere Retouren zu haben.
quelle