L'altro giorno stavo facendo un po 'di benchmark Python e mi sono imbattuto in qualcosa di interessante. Di seguito sono riportati due cicli che fanno più o meno la stessa cosa. Il Loop 1 impiega circa il doppio del loop 2 da eseguire.Perché il loop su range() in Python è più veloce rispetto all'utilizzo di un ciclo while?
Loop 1:
int i = 0
while i < 100000000:
i += 1
Loop 2:
for n in range(0,100000000):
pass
Perché il primo ciclo in modo molto più lento? So che è un esempio banale, ma ha suscitato il mio interesse. C'è qualcosa di speciale nella funzione range() che lo rende più efficiente dell'incremento di una variabile nello stesso modo?
+1 per spiegare una risposta con uno smontaggio – TwentyMiles
In realtà il corpo del ciclo nel primo smontaggio ha 10 operazioni (il salto dalla posizione 32 alla 9).Nell'implementazione corrente di CPython, l'interpretazione di ogni bytecode si traduce in una probabilità piuttosto elevata in una costosa appropriazione indebita di rami indiretti nella CPU (il passaggio all'implementazione del bytecode successivo). Questa è una conseguenza dell'attuale implementazione di CPython, le JIT implementate da swallow a vuoto, PyPy e altre molto probabilmente perderanno questo overhead. Il meglio di loro sarà anche in grado di fare specializzazione di tipo per un aumento della velocità dell'ordine. –
+1 - @kcwu: come lo hai smontato? –