web-dev-qa-db-fra.com

Il est plus efficace d'utiliser if-return-return ou if-else-return?

Supposons que j'ai une instruction if avec une return. Du point de vue de l'efficacité, devrais-je utiliser

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

ou

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

Devrais-je préférer l'un ou l'autre lorsque j'utilise un langage compilé (C) ou un script (Python)?

90
Jorge Leitão

Étant donné que l'instruction return termine l'exécution de la fonction actuelle, les deux formes sont équivalentes (bien que la seconde soit sans doute plus lisible que la première).

L'efficacité des deux formes est comparable, le code machine sous-jacent doit effectuer un saut si la condition if est de toute façon fausse.

Notez que Python prend en charge une syntaxe qui vous permet d’utiliser une seule instruction return dans votre cas:

return A+1 if A > B else A-1
127
Frédéric Hamidi

De Chrome Guide de style:

Ne pas utiliser d'autre après le retour:

# Bad
if (foo)
  return 1
else
  return 2

# Good
if (foo)
  return 1
return 2

return 1 if foo else 2
27
skeller88

En ce qui concerne le style de codage:

La plupart des normes de codage, quelle que soit leur langue, interdisent les déclarations renvoyées à partir d'une seule fonction, ce qui constitue une mauvaise pratique. 

(Bien que personnellement, je dirais qu'il existe plusieurs cas où plusieurs instructions de retour ont du sens: analyseurs syntaxiques de protocole texte/données, fonctions avec traitement étendu des erreurs, etc.)

Le consensus de toutes ces normes de codage de l'industrie est que l'expression devrait être écrite comme suit:

int result;

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

En ce qui concerne l'efficacité:

L'exemple ci-dessus et les deux exemples de la question sont tous complètement équivalents en termes d'efficacité. Dans tous ces cas, le code machine doit comparer A> B, puis se connecter au calcul A + 1 ou A-1, puis stocker le résultat dans un registre de CPU ou sur la pile.

MODIFIER :

Sources:

  • MISRA-C: règle 14.7 de 2004, qui cite à son tour ...:
  • CEI 61508-3. Partie 3, tableau B.9.
  • CEI 61508-7. C.2.9.
4
Lundin

Quel que soit le compilateur sensible, vous ne devriez observer aucune différence. ils devraient être compilés avec le même code machine car ils sont équivalents.

3
Oliver Charlesworth

La version A est plus simple et c'est pourquoi je l'utilise.

Et si vous activez tous les avertissements du compilateur en Java, vous obtiendrez un avertissement sur la deuxième version, car elle est inutile et augmente la complexité du code.

1
juergen d

Personnellement, j'évite les blocs else lorsque cela est possible. Voir la Campagne anti-si

En outre, ils ne facturent pas de frais supplémentaires pour la ligne, vous savez: p 

"Le simple est meilleur que le complexe" & "La lisibilité est roi"

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

Je sais que la question est étiquetée python, mais elle mentionne des langages dynamiques, alors j’ai pensé que je devrais mentionner que dans Ruby, l’instruction if a en fait un type de retour afin que vous puissiez faire quelque chose comme:

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

Ou parce qu'il a aussi un retour implicite simplement 

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

ce qui résout le problème de style de ne pas avoir plusieurs retours assez bien.

0
Jamie Cook

Pensez-y comme ceci:

if (a > b):
    output = a + 1

output = a - 1

return output

Versus ceci:

if (a > b):
    output = a + 1
else:
    output = a - 1

return output

Le premier exemple est non fonctionnel, alors que le second fonctionne bien. Ils ont les mêmes performances, je vous recommande donc d'utiliser l'exemple 2, car il est plus facile à lire à mon avis.

0
Juniorized