У меня есть функция error, которая оценивает значение на основе предыдущего значения и вознаграждений в испытаниях. Затем вычисляется разница между оценочным значением и истинным значением, что дает ошибку. Мне нужно запустить этот код 1000 раз с разными списками испытаний, но в настоящее время он работает слишком медленно. Как мне оптимизировать этот код?
Дополнительная информация: альфа — параметр. Reward и true_value — это списки. Значение всегда начинается с 0,5, но я удаляю это начальное число перед вычислением ошибки.
def loopfunction(alpha, reward, true_value):
difference = []
value = [0.5]
for index, lr in enumerate(reward):
value.append(lever_update(alpha, value[-1], reward[index]))
value.pop(0)
zip_object = zip(value, true_value)
for value_i, true_value_i in zip_object:
difference.append(value_i-true_value)
absdiff = [abs(number) for number in difference]
return absdiff
Функция рычага_update, которая вычисляет значение, находится здесь:
def lever_update(alpha, value, reward):
value += alpha * (reward - value)
return(value)
1 ответ
Использование списков вместо многочисленных
.append
звонки часто в разы быстрее и читабельнее.Список наград следует назвать
rewards
вместоreward
. То же самое касаетсяvalues
а такжеtrue_values
.Нам не нужно
enumerate
вознаграждения, поскольку нам не нужен сам индекс. Мы можем просто перебратьrewards
.def loopfunction(alpha, rewards, true_values): values = [0.5] for reward in rewards: values.append(lever_update(alpha, values[-1], reward)) values.pop(0) return [abs(value - true_value) for value, true_value in zip(values, true_values)]
К сожалению, сейчас я не могу проверить производительность, но я предполагаю, что первый for
цикл занимает большую часть времени выполнения. Это то, на чем я бы сосредоточился при дальнейших улучшениях. В целом, упрощение кода и его читабельность также позволяет упростить рефакторинг и повысить производительность в будущем.
Мы также можем сделать lever_update
более кратко:
def lever_update(alpha, value, reward):
return value + alpha * (reward - value)