2013-02-26 5 views
19

Es ist sehr üblich in C: 'leer, wenn Aussage' wie dieser Hacking:Wie sei es 'leer if-Anweisung' in Python

if(mostlyhappencondition) 
    ;#empty statement 
else{ 
    dosomething; 
} 

Es ist in Python zu arbeiten? Ich meine, können wir die Leistung der App verbessern, indem wir das verwenden? Ich würde auch gerne wissen warum.

+2

Es ist üblich in C? Es sieht für mich wie ein fehlgeleiteter Optimierungsversuch aus. – phant0m

+0

Ich suchte nach einer ähnlichen Kodierungsstrategie. Der Grund liegt nicht in der Optimierung, sondern in der besseren Lesbarkeit des Codes. Anstatt "wenn nicht irgendwas und nicht etwas_etwas" zu verwenden, ist es besser Code als 'wenn etwas oder etwas_zu lesen: pass 'sonst:'_etwas' zu lesen. Die Antworten hier haben geholfen! Vielen Dank. –

Antwort

25

Es gibt eine Leistungsverbesserung, wenn es im "if" keinen anderen Fall gibt, da die Bytecodes die Ausführung nicht in den "if" -Fall überführen.

Hier einige Funktionen und die Ausgabe von dis.dis(foo)

Die folgende Beispielanwendung:

def foo(x): 
    if x: 
     pass 
    else: 
     return x+2 

Disassembliert zu:

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   

Die folgende

def foo(x): 
    if not x: 
     return x+2 

Zerlegt zu:

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) 
3

Nein, das wird die Leistung nicht verbessern. In der Tat ist es auch nicht in C. Wo hast du das gehört?

not/! liest besser und sollte mehr oder weniger die gleiche Geschwindigkeit haben.


Und tatsächlich getestet mit gcc -O4:

#include <stdio.h> 

int main(int argc, char *argv[]) { 
    for(int i = 0; i < 1000000000; i++) { 
     if(!(i < 900000000)) { 
      putchar('.'); 
     } 
    } 
} 

gegen

#include <stdio.h> 

int main(int argc, char *argv[]) { 
    for(int i = 0; i < 1000000000; i++) { 
     if(i < 900000000); 
     else { 
      putchar('.'); 
     } 
    } 
} 

# 1 nahm 6,62 Sekunden und # 2 dauerte 6,64 Sekunden auf meinem Computer.

12

Ich kann nur raten, dass Sie nach der pass Anweisung suchen, manchmal benötigt, um einen leeren Codeblock zu erstellen, um einen Syntaxfehler zu vermeiden.

if mostlyhappencondition: 
    pass 
else: 
    do_something() 

Es wäre viel mehr üblich, dies zu tun nur, was logisch äquivalent ist:

if not mostlyhappencondition: 
    do_something() 

Es gibt keine signifikanten Leistungssteigerungen hier gefunden werden.

3

, bis die Zeit Sie irgend etwas in if True: dont haben Sie

if not mostlyhappenedcondition: 
    do something() 

tun könnte, wenn Sie in "if" auch in Zukunft setzen müssen, um irgend etwas nicht, dann ist es redundunt in Ihrem Code.

Verwandte Themen