Lors de l'écriture d'un script, j'ai découvert la fonction numpy.random.choice. Je l'ai implémenté car il était beaucoup plus propre que l'instruction if. Cependant, après l'exécution du script, je me suis rendu compte qu'il est significativement plus lent que l'instruction if.Pourquoi random.choice est-il si lent?
Ce qui suit est un MWE. La première méthode prend 0.0 s, tandis que la seconde prend 7.2 s. Si vous agrandissez la boucle i, vous verrez à quelle vitesse random.choice ralentit.
Quelqu'un peut-il commenter pourquoi random.choice est tellement plus lent?
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))
Ce n'est pas vraiment une comparaison équitable. Chaque fois, numpy doit prendre la somme cumulative de la liste p, la mettre dans un nouveau vecteur, puis itérer dessus. Vous faites effectivement le prétraitement en sachant qu'il n'y a que trois variables, et que la somme du premier et du troisième est 0,5. Au-delà de cela, comme indiqué ci-dessous, numpy est optimisé pour les opérations vectorisées, pas pour faire une seule opération simple des milliers de fois. –
Utilisez également 'timeit', pas' time' tout seul. – Marcin