Het is efficiënter om if-return-return of if-else-return te gebruiken?

Stel dat ik een if-statement heb met een return. Moet ik vanuit het oogpunt van efficiëntie gebruik maken van

if(A > B):
    return A+1
return A-1

of

if(A > B):
    return A+1
else:
    return A-1

Moet ik de een of de ander verkiezen als ik een gecompileerde taal (C) of een gescripte taal (Python) gebruik?


Antwoord 1, autoriteit 100%

Aangezien de return-instructie de uitvoering van de huidige functie beëindigt, zijn de twee vormen equivalent (hoewel de tweede aantoonbaar beter leesbaar is dan de eerste).

De efficiëntie van beide vormen is vergelijkbaar, de onderliggende machinecode moet een sprong uitvoeren als de voorwaarde ifsowieso onwaar is.

Merk op dat Python een syntaxis ondersteunt waarmee u in uw geval slechts één return-statement kunt gebruiken:

return A+1 if A > B else A-1

Antwoord 2, autoriteit 19%

Van Chromium’s-stijlgids:

Niet anders gebruiken na terugkomst:

# Bad
if (foo)
  return 1
else
  return 2
# Good
if (foo)
  return 1
return 2
return 1 if foo else 2

Antwoord 3, autoriteit 3%

Persoonlijk vermijd ik elseblokkades waar mogelijk. Zie de Anti-if-campagne

Bovendien rekenen ze geen ‘extra’ voor de lijn, weet je :p

“Eenvoudig is beter dan complex”& “Leesbaarheid is koning”

delta = 1 if (A > B) else -1
return A + delta

Antwoord 4, autoriteit 2%

Met betrekking tot de coderingsstijl:

De meeste coderingsstandaarden, ongeacht de taal, verbieden meerdere retourinstructies van een enkele functie als een slechte gewoonte.

(Hoewel ik persoonlijk zou zeggen dat er verschillende gevallen zijn waarin meerdere return-statements zinvol zijn: tekst-/dataprotocol-parsers, functies met uitgebreide foutafhandeling, enz.)

De consensus van al die coderingsstandaarden in de industrie is dat de uitdrukking moet worden geschreven als:

int result;
if(A > B)
{
  result = A+1;
}
else
{
  result = A-1;
}
return result;

Met betrekking tot efficiëntie:

Het bovenstaande voorbeeld en de twee voorbeelden in de vraag zijn allemaal volledig equivalentin termen van efficiëntie. De machinecode moet in al deze gevallen A > B, vertak dan naar de A+1- of de A-1-berekening en sla het resultaat daarvan op in een CPU-register of op de stapel.

BEWERK:

Bronnen:

  • MISRA-C:2004 regel 14.7, die op zijn beurt citeert…:
  • IEC 61508-3. Deel 3, tabel B.9.
  • IEC 61508-7. C.2.9.

Antwoord 5, autoriteit 2%

Met een verstandige compiler zou je geen verschil moeten zien; ze moeten worden gecompileerd naar identieke machinecode omdat ze equivalent zijn.


Antwoord 6

Dit is een kwestie van stijl (of voorkeur) aangezien de tolk er niet om geeft. Persoonlijk zou ik proberen niet de laatste verklaring af te leggen van een functie die een waarde retourneert op een ander inspringniveau dan de functiebasis. De else in voorbeeld 1 verduistert, al is het maar een klein beetje, waar het einde van de functie is.

Bij voorkeur gebruik ik:

return A+1 if (A > B) else A-1

Omdat het zowel voldoet aan de goede conventie van het hebben van een enkele return-instructie als de laatste instructie in de functie (zoals reeds vermeld) als aan het goede functionele programmeerparadigma om tussenresultaten in imperatieve stijl te vermijden.

Voor complexere functies geef ik er de voorkeur aan de functie op te splitsen in meerdere subfuncties om voortijdige retouren indien mogelijk te voorkomen. Anders ga ik terug naar het gebruik van een imperatieve stijlvariabele genaamd rval. Ik probeer niet meerdere return-statements te gebruiken, tenzij de functie triviaal is of de return-statement voor het einde het gevolg is van een fout. Voortijdig terugkeren maakt duidelijk dat je niet verder kunt. Voor complexe functies die zijn ontworpen om te vertakken in meerdere subfuncties, probeer ik ze te coderen als case-statements (bijvoorbeeld aangedreven door een dictaat).

Sommige posters hebben de snelheid van werken genoemd. Snelheid van runtime is voor mij secundair, want als je snelheid van uitvoering nodig hebt, is Python niet de beste taal om te gebruiken. Ik gebruik Python omdat de efficiëntie van het coderen (d.w.z. het schrijven van foutloze code) voor mij belangrijk is.


Antwoord 7

Versie A is eenvoudiger en daarom zou ik het gebruiken.

En als u alle compilerwaarschuwingen in Java inschakelt, krijgt u een waarschuwing bij de tweede versie omdat dit onnodig is en de code complexer maakt.


Antwoord 8

Ik weet dat de vraag is getagd als python, maar er worden dynamische talen genoemd, dus ik dacht dat ik zou moeten vermelden dat in ruby het if-statement eigenlijk een retourtype heeft, zodat je zoiets kunt doen

def foo
  rv = if (A > B)
         A+1
       else
         A-1
       end
  return rv 
end

Of omdat het ook een impliciet rendement heeft, gewoon

def foo 
  if (A>B)
    A+1
  else 
    A-1
  end
end

wat het stijlprobleem van het niet hebben van meerdere retouren goed omzeilt.


Antwoord 9

Vanuit het oogpunt van prestaties maakt het niet uit in Python, en ik zou hetzelfde aannemen voor elke moderne taal die er is.

Het komt echt neer op stijl en leesbaarheid. Uw tweede optie (if-else-blok) is beter leesbaar dan de eerste, en een stuk beter leesbaar dan de ternaire one-liner-operatie.

Other episodes