Mentre scrivevo una sceneggiatura ho scoperto la funzione numpy.random.choice. L'ho implementato perché era molto più pulito dell'equivalente istruzione if. Tuttavia, dopo aver eseguito la sceneggiatura mi sono reso conto che è significativamente più lento di rispetto all'istruzione if.Perché random.choice è così lento?
Quanto segue è un MWE. Il primo metodo richiede 0,0 s, mentre il secondo richiede 7,2 s. Se scalate il ciclo i, vedrete quanto velocemente random.choice rallenta.
Qualcuno può commentare perché random.choice è molto più lento?
import numpy as np
import numpy.random as rand
import time as tm
#-------------------------------------------------------------------------------
tStart = tm.time()
for i in xrange(100):
for j in xrange(1000):
tmp = rand.rand()
if tmp < 0.25:
var = 1
elif tmp < 0.5:
var = -1
print('Time: %.1f s' %(tm.time() - tStart))
#-------------------------------------------------------------------------------
tStart = tm.time()
for i in xrange(100):
for j in xrange(1000):
var = rand.choice([-1, 0, 1], p = [0.25, 0.5, 0.25])
print('Time: %.1f s' %(tm.time() - tStart))
Non è proprio un paragone equo. Ogni volta, numpy deve prendere la somma cumulativa della lista p, metterla in un nuovo vettore e quindi scorrere su di essa. Stai effettivamente facendo il pre-processo sapendo che ci sono solo tre variabili e che la somma del primo e del terzo è 0,5. Oltre a ciò, come indicato di seguito, numpy è ottimizzato per le operazioni vettorializzate, non per fare una singola operazione semplice migliaia di volte. –
Inoltre, usa 'timeit', non' time' da solo. – Marcin