Il file esiste e il file non esiste. C'è una differenza nelle prestazioni?

0

Diciamo che sto controllando una directory per l'esistenza di un file, e quindi a seconda che esista o meno il file, agisco di conseguenza. Ad esempio, vedi i due frammenti di Python qui sotto.

if os.path.isfile(file_name):
    # do task A
else:
    # do task B

o

if not os.path.isfile(file_name):
    # do task B
else:
    # do task A

C'è una differenza tra i due o è solo semantica? Mentre l'esempio che ho dato utilizza Python, le regole si applicherebbero alle altre lingue?

    
posta Dryden Long 02.07.2014 - 18:21
fonte

4 risposte

10

È considerata la migliore pratica per organizzare la condizione in modo che sia più probabile che entri nella tua clausola if. La condizione < 50% dovrebbe essere la tua altra clausola. In questo caso, dipende da cosa ti aspetti. Se pensi di trovare il file, dovresti usare if os.path.isfile(file_name): .

Questo motivo risale all'ottimizzazione della ramificazione, sebbene al giorno d'oggi la differenza sia così sottile che, a meno che le prestazioni non fossero molto importanti, non lo farebbe per ottimizzare ma piuttosto per fornire una convenzione al programmatore sul fatto che questo è il comportamento previsto.

Un altro motivo per cui potresti voler cambiare le clausole if e else è se sei costretto a pronunciare le tue condizioni in modo imbarazzante. Un esempio di questo è se hai già isNotOpen , e vuoi controllare la condizione più probabile che isNotOpen sia falsa, allora sarebbe brutto scrivere if not isNotOpen: . Una soluzione potrebbe essere quella di cambiare la clausola if e the else e scrivere solo if isNotOpen: , anche se penso che in tali circostanze, sarebbe meglio nominare le variabili in base alle condizioni che si aspettano siano vere. In altre parole, non avresti una variabile denominata isNotOpen , ma piuttosto isOpen . Quando si preme l'istruzione if, la condizione più probabile non è la variabile negata ma la variabile stessa, quindi if isOpen: che garantisce entrambi che sia leggibile e che la condizione più probabile sia nella clausola if.

Sotto questo aspetto, ci sono quelli che non aggiungerebbero affatto "not" nel nome, anche se non ho problemi con questo finché è una condizione che ti aspetti (e quindi hai vinto " t mai dover testare la negazione di quella condizione).

Penso che oltre a questo, non vi è alcun motivo per cui si dovrebbe fare uno sull'altro, tuttavia mi aspetterei (si aspetti che in questo contesto sia un termine allentato) la condizione più probabile per essere nella clausola if in qualsiasi lingua , non solo in Python. Ma sono solo i miei 10 centesimi.

    
risposta data 02.07.2014 - 18:28
fonte
8

C'è 0 differenza. Tuttavia, ci sono alcune linee guida su cosa inserisci in se e cosa - nel resto.

Uno è che dovresti provare a mettere un risultato "positivo" nel if. Molte lingue hanno una negazione più breve di "non" (Java ha "!" Che non dovrebbe avere spazi bianchi intorno ad esso) ed è facile trascurarle, specialmente se si sta guardando ad un nome di metodo dettagliato proprio accanto ad esso.

Un altro è che dovresti prima mettere il risultato previsto, e inaspettatamente dopo.

Una terza cosa che ricordo è che se uno dei rami ti permette di terminare in anticipo, metti prima questo e il resto del codice al di fuori di un qualsiasi. (Mi sembra di ricordare anche che ce n'è uno che è l'esatto opposto di questo ...)

TL; DR:
Nessuna differenza per il compilatore. Solo convenzione e leggibilità.

    
risposta data 02.07.2014 - 18:31
fonte
1

In generale, è più facile per le persone capire il condizionale senza la negazione - è una cosa in meno a cui pensare quando decifrare il significato della condizione. La differenza di prestazioni sarà probabilmente trascurabile e preoccuparsi è l'ottimizzazione prematura. (Inoltre, se stai lavorando in Python, questo tipo di micro-ottimizzazione è inutile: se hai davvero un problema di prestazioni, lo risolverai usando algoritmi migliori o implementando il codice critico in C.)

Tuttavia, in questo caso entrambe le opzioni sono potenzialmente condizioni di gara se l'attività A o B prevede di agire sul file. Il file può apparire / scomparire tra il controllo della condizione if e l'esecuzione di entrambe le attività. In genere procedi con l'attività A come se il file fosse presente e gestisci l'eccezione se risulta che non ci fosse. File I / O è una forma di concorrenza e si dovrebbe assumere che le cose possano cambiare tra le due istruzioni di un programma.

    
risposta data 02.07.2014 - 21:17
fonte
0

Python Optimizer è abbastanza stupido in base alla progettazione, ma questo è un caso che l'ottimizzatore è in grado di rilevare:

>>> def a():
...     if foobar:
...         pass
... 
>>> dis.dis(a)
  2           0 LOAD_GLOBAL              0 (foobar)
              3 POP_JUMP_IF_FALSE        9

  3           6 JUMP_FORWARD             0 (to 9)
        >>    9 LOAD_CONST               0 (None)
             12 RETURN_VALUE      
>>> def b():
...     if not foobar:
...         pass
... 
>>> dis.dis(b)
  2           0 LOAD_GLOBAL              0 (foobar)
              3 POP_JUMP_IF_TRUE         9

  3           6 JUMP_FORWARD             0 (to 9)
        >>    9 LOAD_CONST               0 (None)
             12 RETURN_VALUE        

Per il quale dovresti usare, scrivi codice leggibile piuttosto che preoccuparti di piccoli dettagli come questo.

    
risposta data 02.07.2014 - 21:03
fonte

Leggi altre domande sui tag