Il est très courant en C: pirater 'une instruction if vide' comme ceci:
if(mostlyhappencondition)
;#empty statement
else{
dosomething;
}
Ça marche en Python? Je veux dire, pouvons-nous améliorer les performances de l'application en utilisant cela? J'aimerais aussi savoir pourquoi.
Il y a une amélioration des performances s'il n'y a pas de cas else dans le "si", puisque les bytecodes ne passent pas l'exécution dans le cas "if".
Voici quelques fonctions et la sortie de dis.dis(foo)
L'exemple d'application suivant:
def foo(x):
if x:
pass
else:
return x+2
Se démonte pour:
5 0 LOAD_FAST 0 (x)
3 POP_JUMP_IF_FALSE 9
6 6 JUMP_FORWARD 8 (to 17)
8 >> 9 LOAD_FAST 0 (x)
12 LOAD_CONST 1 (2)
15 BINARY_ADD
16 RETURN_VALUE
>> 17 LOAD_CONST 0 (None)
20 RETURN_VALUE
Le suivant
def foo(x):
if not x:
return x+2
Se démonte pour:
11 0 LOAD_FAST 0 (x)
3 POP_JUMP_IF_TRUE 14
12 6 LOAD_FAST 0 (x)
9 LOAD_CONST 1 (2)
12 BINARY_ADD
13 RETURN_VALUE
>> 14 LOAD_CONST 0 (None)
Je peux seulement deviner que vous recherchez l'instruction pass
, parfois nécessaire pour créer un bloc de code vide pour éviter une erreur de syntaxe.
if mostlyhappencondition:
pass
else:
do_something()
Il serait beaucoup plus habituel de le faire, ce qui est logiquement équivalent:
if not mostlyhappencondition:
do_something()
Il n'y a aucun gain de performance significatif à trouver ici.
Non, cela n'améliorera pas les performances. En fait, ce n'est pas non plus en C. Où avez-vous entendu cela?
not
/!
lit mieux et devrait avoir plus ou moins la même vitesse.
Et effectivement testé avec gcc -O4
:
#include <stdio.h>
int main(int argc, char *argv[]) {
for(int i = 0; i < 1000000000; i++) {
if(!(i < 900000000)) {
putchar('.');
}
}
}
vs.
#include <stdio.h>
int main(int argc, char *argv[]) {
for(int i = 0; i < 1000000000; i++) {
if(i < 900000000);
else {
putchar('.');
}
}
}
# 1 a pris 6,62 secondes et # 2 a pris 6,64 secondes sur mon ordinateur.
Jusqu'à ce que vous n'ayez rien dans if True:
vous pourriez faire
if not mostlyhappenedcondition:
do something()
Si vous n'avez pas besoin de mettre quoi que ce soit dans "si" même à l'avenir, alors c'est redondant dans votre code.