- Легко создать массив функций и выполнить их в любом oop.
- Легко предоставить аргументы либо в соответствующем массиве одинаковой длины, либо массив может состоять из кортежей (fn, arg).
Для 2 l oop просто
for fn_ar in arr # arr is [(myfunc, [1,2,3]), (func2, [10,11,12]), ...]
fn_ar[1](fn_ar[2])
end
Вот проблема: аргументы, которые я использую, являются массивами очень больших массивов , В # 2 аргумент, который будет вызываться с помощью функции, будет текущим значением массива при первоначальном создании записи arg кортежа. Мне нужно предоставить имена массивов в качестве аргумента и отложить оценку аргументов до тех пор, пока соответствующая функция не будет запущена в теле l oop.
Я мог бы предоставить массивы, используемые в качестве входных данных, в качестве выражения и Выразите выражение в l oop, чтобы предоставить необходимые аргументы. Но eval не может быть eval в локальной области.
То, что я сделал, сработало (вроде), заключалось в создании замыкания для каждой функции, которая захватывает массивы (которые на самом деле являются просто ссылкой на хранилище). Это работает, потому что единственным аргументом для каждой функции, которая изменяется в теле l oop, оказывается счетчик l oop. Рассматриваемые функции обновляют массивы на месте. Аргумент массива - это просто ссылка на место хранения, поэтому каждая функция, выполняемая в теле l oop, видит самые последние значения массивов. Это сработало. Это было не сложно сделать. Это очень, очень медленно. Это известная проблема в Юлии.
Я попробовал рекомендуемые советы в разделе производительности руководства. Убедитесь, что захваченные переменные набраны до того, как они будут захвачены, чтобы JIT знал, что они из себя представляют. Не влияет на перф. Другой совет - поместить определение функции карри с данными для замыкания в блок let. Пробовал это. Не влияет на перф. Возможно, я неправильно реализовал подсказки - я могу предоставить фрагмент кода, если это поможет.
Но я бы лучше задал вопрос о том, что я пытаюсь сделать, а не запутал воду своим прошлым усилия, которые не могут идти по правильному пути.
Вот небольшой фрагмент, который более реалистичен c, чем приведенный выше:
Просто пара функций и аргументов:
(affine!, "(dat.z[hl], dat.a[hl-1], nnw.theta[hl], nnw.bias[hl])")
(relu!, "(dat.a[hl], dat.z[hl])")
Конечно, аргументы можно заключить в Meta.parse как выражение. dat.z и dat.a - это матрицы, используемые в машинном обучении. hl индексирует слой модели для линейного результата и нелинейной активации.
Упрощенная версия l oop, где я хочу выполнить стек функций по слоям модели:
function feedfwd!(dat::Union{Batch_view,Model_data}, nnw, hp, ff_execstack)
for lr in 1:hp.n_layers
for f in ff_execstack[lr]
f(lr)
end
end
end
Итак, закрытие массивов происходит слишком медленно. Eval Я не могу приступить к работе.
Есть предложения ...?
Спасибо, Льюис