Beim Schreiben eines Skripts habe ich die Funktion numpy.random.choice entdeckt. Ich habe es implementiert, weil es viel sauberer war als die äquivalente if-Anweisung. Nach dem Ausführen des Skripts stellte ich jedoch fest, dass es wesentlich langsamer ist als die if-Anweisung.Warum ist random.choice so langsam?
Folgendes ist ein MWE. Die erste Methode dauert 0,0 s, während die zweite 7,2 s dauert. Wenn Sie die i Schleife vergrößern, sehen Sie, wie schnell random.choice langsamer wird.
Kann jemand kommentieren, warum random.choice so viel langsamer ist?
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))
Das ist nicht wirklich ein fairer Vergleich. Jedes Mal muss numpy die kumulative Summe der p-Liste nehmen, diese in einen neuen Vektor einfügen und dann darüber iterieren. Sie tun effektiv Vorverarbeitung, indem Sie wissen, dass es nur drei Variablen gibt, und dass die Summe der ersten und dritten .5 ist. Darüber hinaus ist numpy, wie unten erwähnt, für vektorisierte Operationen optimiert, nicht für eine einfache Operation tausendfach. –
Verwenden Sie auch "Zeit", nicht "Zeit" für sich. – Marcin