Нахождение разницы между оценочной стоимостью и истинной стоимостью в задаче вознаграждения

У меня есть функция 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 ответ
1

  1. Использование списков вместо многочисленных .append звонки часто в разы быстрее и читабельнее.

  2. Список наград следует назвать rewards вместо reward. То же самое касается values а также true_values.

  3. Нам не нужно 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)

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *