Если вы знаете, что один из входных данных не нужен после вычисления, и если он соответствует форме и типу элемента одного из выходных данных, вы можете указать, что вы хотите, чтобы соответствующий входной буфер был передан для хранения выходных данных. Это уменьшит объем памяти, необходимой для выполнения, на размер пожертвованного буфера. отсюда.
Но очень странно, я обнаружил, что в моем коде ddpg порядок переданной переменной (совпадающий вывод) среди всех возвращаемых переменных может сильно повлиять на производительность. Ниже приведен сокращенный пример.
Как показано в следующем псевдокоде, за исключением порядка возвращаемых переменных, все идентично, но производительность сильно различается. Для меня это очень странно.
Псевдокод:
Код: Выделить всё
def train_one_step_return_later(key, model_params, buffer, buffer_state):
# sample data -> add to buffer -> sample from buffer -> update model
...
return model_params, buffer_state, key
def train_one_step_return_early(key, model_params, buffer, buffer_state):
model_params, buffer_state, key = train_one_step_return_later(
key, model_params, buffer, buffer_state)
return buffer_state, model_params, key
def benchmark_return_later():
# timing jitted train_one_step_return_later
...
def benchmark_return_early():
# timing jitted train_one_step_return_early
...
if __name__ == "__main__":
print("-------- return later ---------")
benchmark_return_later()
print("\n-------- return early ---------")
benchmark_return_early()
Код: Выделить всё
-------- return later ---------
Average time: 638 microseconds
-------- return early ---------
Average time: 73 microseconds
Полный код: см. здесь.
Подробнее здесь: https://stackoverflow.com/questions/798 ... formance-s
Мобильная версия