2012-07-13 8 views

risposta

9

Utilizzando float(7) aggiunge un po 'di inutili spese generali — Python deve trovare la funzione float in globals() e chiamarlo. L'utilizzo di 7.0 esegue tutte le conversioni necessarie in fase di compilazione anziché in fase di esecuzione. Puoi vederlo usando lo Python bytecode disassembler.

>>> import dis 
>>> def f(): return 7.0 
... 
>>> def g(): return float(7) 
... 
>>> dis.dis(f) 
    1   0 LOAD_CONST    1 (7.0) 
       3 RETURN_VALUE   
>>> dis.dis(g) 
    1   0 LOAD_GLOBAL    0 (float) 
       3 LOAD_CONST    1 (7) 
       6 CALL_FUNCTION   1 
       9 RETURN_VALUE   
0

7.0 è "migliore", non è necessario che il cast galleggi, lo farà automaticamente.

float() si salva meglio per trasmettere un oggetto non mobile a un valore float.

1

I letterali float possono essere scritti come 7.0, che è corretto in quanto sono automaticamente di tipo float.

Se si intende convertire un numero intero o una stringa in virgola mobile, la funzione float() è appropriata ma non è necessario chiamare tale funzione per scrivere un valore letterale float.

9

utilizzare l'approccio 7.0, l'approccio float(7) viene utilizzato per trasformare i tipi interi o stringhe di carri, quindi è un uso diverso, ad esempio:

a = 7 
b = "7" 
print float(a) 
7.0 
print float(b) 
7.0 
+0

Ah, ora ne vedo l'uso. Grazie! – piperchester

+1

nessun problema, e benvenuti a SO :) – Hassek

+1

'float()' incorre in alcuni overhead pure. –

0

Utilizzando float(0) è molto più esplicito quando ri-leggere il vostro codice in un secondo momento, causando meno confusione in seguito se si cade accidentalmente ".0".

+0

In che modo esattamente uno lo cade accidentalmente? –

+0

@MichaelHoffman Supponiamo di avere 'this_should_be_a_float = 7.0/denominatore', dove denominatore è un int. Pensavo che per la manutenibilità futura sarebbe bello avere un modo molto esplicito per sottolineare che il '7.0' doveva essere un float per non avere un problema di arrotondamento nel caso qualcuno in seguito avesse cambiato il 7.0 in un'altra costante, ad esempio come 6, e ha dimenticato di aggiungere il ".0". – CraigTeegarden

+0

Dovresti usare 'da __future__ import division' se non lo sei già. Quindi questo non sarà un problema. –

6

Di seguito sono tutti equivalenti in Python:

>>> 7. == 7.0 == float(7) == float("7") 
True 

Vorrei evitare di utilizzare float(7) o float("7") quando si è hard-codifica il valore, come l'interprete Python deve prima il cast del valore di un intero o una stringa, quindi convertirla in virgola mobile.

Per evitare questo sovraccarico, utilizzare 7. o 7.0 per fornire a Python un valore letterale float.

Ovviamente, float() deve essere ancora utilizzato per convertire altri tipi di dati in un float.

0

7.0 dovrebbe essere più veloce. float(7) crea un numero intero, quindi chiama la funzione float() per convertire il numero intero in virgola mobile, pertanto chiamare float(7) implica l'overhead delle chiamate di funzione e qualsiasi errore durante il controllo della funzione float().

Per gli scopi pratici, ovviamente, la differenza di velocità è improbabile che importi molto (a meno che non si sia in un ciclo profondo in cui il codice viene chiamato centinaia di milioni di volte), ma c'è qualcosa di inelegante nel richiamare un funzione di conversione quando l'interprete ha una sintassi incorporata per la costruzione di float.

Utilizzare float() quando si dispone di qualcosa che non è un oggetto mobile (come una stringa o un numero intero) che si desidera convertire.

Problemi correlati