Supposons que j'ai une if
déclaration avec un 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
Dois-je préférer l'un ou l'autre lorsque j'utilise un langage compilé (C) ou un langage scripté (Python)?
python
c
performance
compiler-construction
Jorge Leitao
la source
la source
Réponses:
Puisque l'
return
instruction met fin à l'exécution de la fonction courante, 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
if
condition est de toute façon fausse.Notez que Python prend en charge une syntaxe qui vous permet d'utiliser une seule
return
instruction dans votre cas:la source
return (A>B)?A+1:A-1;
Cependant, il n'y a absolument aucun gain de performances à écrire un code comme celui-ci. Tout ce que nous avons réalisé est de rendre le code obscurci, illisible et dans certains cas plus vulnérable aux promotions de type implicites.<
est une mauvaise pratique car-1 < 1u
produit un résultat inattendu.-1 < 1u
, ce dont je doute, il repérerait facilement le bogue. Cependant, beaucoup de gens écriraient une version du code que j'ai posté. J'ai vu de tels bogues beaucoup trop souvent dans le code de production pour faire confiance à l'opérateur?:. En règle générale également, si la langue vous donne deux façons différentes de faire la même chose, n'en utilisez qu'une seule, ne choisissez pas l'une des deux au hasard en fonction de votre humeur.Tiré du guide de style de Chromium :
Ne pas utiliser d'autre après le retour:
la source
if-else-return
branches ne sont presque jamais égales (si elles le sont, alors vous devriez quand même refactoriser; soit en utilisant uneswitch
construction ou pour Python, en énumérant un dict / en utilisant un appelable / etc.). Par conséquent, presque tousif-else-return
sont des cas de clauses de garde et ceux-ci sont toujours testables (simuler l'expression testée) sans l'extensionelse
.Concernant le style de codage:
La plupart des normes de codage, quelle que soit la langue, interdisent les déclarations de retour multiples d'une seule fonction comme une mauvaise pratique.
(Bien que personnellement, je dirais qu'il existe plusieurs cas où plusieurs déclarations de retour ont du sens: analyseurs de protocole de texte / données, fonctions avec gestion des erreurs étendue, etc.)
Le consensus de toutes ces normes de codage de l'industrie est que l'expression doit être écrite comme suit:
Concernant l'efficacité:
L'exemple ci-dessus et les deux exemples de la question sont tous complètement équivalents en termes d'efficacité. Le code machine dans tous ces cas doit comparer A> B, puis passer au calcul A + 1 ou A-1, puis stocker le résultat de cela dans un registre CPU ou sur la pile.
ÉDITER :
Sources:
la source
return
là où il se trouve être clair est la manière idiomatique de le faire en Python.Avec n'importe quel compilateur sensible, vous ne devriez observer aucune différence; ils doivent être compilés avec un code machine identique car ils sont équivalents.
la source
C'est une question de style (ou de préférence) puisque l'interprète s'en fiche. Personnellement, j'essaierais de ne pas faire la déclaration finale d'une fonction qui renvoie une valeur à un niveau d'indentation autre que la base de la fonction. Le else dans l'exemple 1 obscurcit, même légèrement, où se trouve la fin de la fonction.
De préférence j'utilise:
Comme il obéit à la fois à la bonne convention d'avoir une seule instruction return comme dernière instruction dans la fonction (comme déjà mentionné) et au bon paradigme de programmation fonctionnelle consistant à éviter les résultats intermédiaires de style impératif.
Pour les fonctions plus complexes, je préfère diviser la fonction en plusieurs sous-fonctions pour éviter les retours prématurés si possible. Sinon, je reviens à l'utilisation d'une variable de style impérative appelée rval. J'essaie de ne pas utiliser plusieurs déclarations de retour à moins que la fonction ne soit triviale ou que l'instruction de retour avant la fin soit le résultat d'une erreur. Revenir prématurément met en évidence le fait que vous ne pouvez pas continuer. Pour les fonctions complexes qui sont conçues pour se diviser en plusieurs sous-fonctions, j'essaie de les coder comme des instructions de cas (pilotées par un dict par exemple).
Certaines affiches ont mentionné la vitesse de fonctionnement. La vitesse d'exécution est secondaire pour moi car si vous avez besoin de vitesse d'exécution, Python n'est pas le meilleur langage à utiliser. J'utilise Python car c'est l'efficacité du codage (c'est-à-dire l'écriture de code sans erreur) qui m'importe.
la source
var n = 1 if (A > B) else -1
return A+n
J'évite personnellement les
else
blocages lorsque cela est possible. Voir le campagne anti-ifDe plus, ils ne facturent pas de `` supplément '' pour la ligne, vous savez: p
"Simple est meilleur que complexe" et "La lisibilité est reine"
la source
dict
s pour éviter les différences est une très mauvaise idée en termes de performances.La version A est plus simple et c'est pourquoi je l'utiliserais.
Et si vous activez tous les avertissements du compilateur en Java, vous obtiendrez un avertissement sur la deuxième version, car il n'est pas nécessaire et augmente la complexité du code.
la source
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
Ou parce qu'il a aussi un retour implicite simplement
qui contourne le problème de style de ne pas avoir de retours multiples assez bien.
la source