При написании сценария я обнаружил функцию numpy.random.choice. Я реализовал его, потому что он был намного чище, чем эквивалентный оператор if. Однако после запуска скрипта я понял, что значительно медленнее, чем оператор if.Почему random.choice так медленно?
Ниже приведено MWE. Первый метод принимает 0,0 с, а второй - 7,2 с. Если вы масштабируете цикл i, вы увидите, как быстро random.choice замедляется.
Может ли кто-нибудь прокомментировать, почему random.choice настолько медленнее?
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))
Это не очень хорошее сравнение. Каждый раз numpy должен принимать кумулятивную сумму p-списка, помещать его в новый вектор и затем перебирать по нему. Вы эффективно выполняете предварительную обработку, зная, что есть только три переменные и что сумма первого и третьего равна .5. Помимо этого, как отмечено ниже, numpy оптимизирован для векторизованных операций, а не для выполнения одной простой операции тысячи раз. –
Кроме того, используйте 'timeit', а не' time' самостоятельно. – Marcin