Il motivo per cui ciò accade è correlato al compilatore JIT, che sta ottimizzando il ciclo MATLAB. È possibile disabilitare/abilitare l'acceleratore JIT utilizzando feature accel off
e feature accel on
. Quando disabiliti l'acceleratore, i tempi cambiano drasticamente.
MATLAB con Accel on: Elapsed time is 0.009407 seconds.
MATLAB con Accel off: Elapsed time is 0.287955 seconds.
pitone: time cost = 0.0511920452118
Così l'acceleratore JIT sta causando direttamente l'aumento di velocità che si stanno notando. C'è un'altra cosa che dovresti considerare, che è legata al modo in cui hai definito gli indici di iterazione. In entrambi i casi, MATLAB e Python, hai usato Iterator per definire i tuoi loop. In MATLAB crei i valori attuali aggiungendo le parentesi quadre ([]
), e in python usi range
invece di xrange
.Quando si apportano le modifiche
% MATLAB
for i = [1:1000]
for j = [1:1000]
# python
for r in range(1000):
for c in range(1000):
I tempi diventano
MATLAB con Accel on: Elapsed time is 0.338701 seconds.
MATLAB con Accel off: Elapsed time is 0.289220 seconds.
pitone: time cost = 0.0606048107147
Una considerazione finale è se dovessi aggiungere un calcolo veloce al ciclo. cioè t=t+1
. Poi i tempi diventano
MATLAB con Accel on: Elapsed time is 1.340830 seconds.
MATLAB con Accel off: Elapsed time is 0.905956 seconds.
(Sì off è stato più veloce)
pitone: time cost = 0.147221088409
penso che la morale è che la le velocità di calcolo di loop for, out-of-the-box, sono paragonabili per cicli estremamente semplici, a seconda della situazione. Tuttavia, ci sono altri strumenti numerici in python che possono velocizzare le cose in modo significativo, numpy e PyPy sono stati allevati finora.
Non lo sono anche se c'è nessuna differenza con lo strumento di ottimizzazione del compilatore, ma hai provato a passare invece di continuare? Forse se aggiungessi un calcolo molto semplice, 't = t + 1' allora cambierebbe. – slbass
Testare il ciclo con 'python -m timeit' mostra che usare' pass' è un po 'più lento di 'continue', ma non in modo significativo. Sulla mia macchina i cicli richiedono 16 msec, ovvero meno della metà di quanto afferma l'OP. Si noti inoltre che MATLAB ha un [JIT] (http://www.matlabtips.com/matlab-is-no-longer-slow-at-for-loops/), quindi tali differenze sono da aspettarsi * specialmente * con semplici loop. – Bakuriu
Potrebbe essere utile inserire qualcosa nel ciclo, nel caso in cui Matlab sia abbastanza intelligente da realizzare i loop in realtà non fanno nulla, e li ha ottimizzati. – Aya