web-dev-qa-db-fra.com

Comment créer une 'instruction if vide' dans python

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.

26
JJP

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)
35
koblas

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.

15
wim

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.

3
Ry-

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.

3
Kaunteya