2016-03-22 2 views
9

В Julia у меня есть функция для сложного моделирования, monte_carlo_sim(), которая включает в себя множество параметров. Внутри этой функции мне нужно вызвать многие другие функции. Я мог писать автономные функции за пределами из monte_carlo_sim(), но тогда мне нужно было бы передать множество параметров, многие из которых были постоянными внутри этой функции, что принесло бы в жертву элегантность и ясность (и, возможно, не воспользовалось бы фактом что это постоянные переменные?). Есть ли причина в производительности, чтобы не включать функции в функции? В качестве примера игрушек температура T является постоянной, и если я не хочу передавать эту переменную своей функции compute_Boltzmann(), я мог бы сделать следующее. Что-то не так с этим?Функции внутри функции в Julia

function monte_carlo_sim(temp::Float64, N::Int) 
    const T = temp 

    function compute_Boltzmann(energy::Float64) 
     return exp(-energy/T) 
    end 

    # later call this function many times 
    for i = 1:1000 
     energy = compute_energy() 
     b = compute_Boltzmann(energy) 
    end 
end 

С другой стороны, я мог бы определить новый тип константный SimulationParameters и передать это compute_Boltzmann вместо этого, и писать compute_Boltzmann вне функции monte_carlo_sim в here? Это лучше? Тем не менее, я бы передал больше информации, чем мне нужно в этом случае.

ответ

2

С Google привел меня сюда, возможно, добавить комментарий

Вложенные функции, используемые медленнее, смотри, например, this discussion на GitHub ... в 2013 году Но не больше: работает точно тесты там v0.6, теперь они все одинаковы.

Это по-прежнему верно для меня, если (например, вопрос) внутренняя функция неявно зависит от вещей, определенных внутри внешней функции, которые должны быть явно переданы, если бы она была автономной функцией.

2

Как вы упомянули, четкость кода очень важна, поэтому вы должны сосредоточиться на этом на первом месте. Если вы чувствуете, что функции внутри функций - это ваш стиль и помогает вам (и вашим коллегам) лучше понимать ваш сценарий, чем делать это. Что касается производительности, вы всегда можете сравнить 2 реализации с помощью макроса @time. Я бы не ожидал, что ваши функции в реализации функций пострадают, но это всегда стоит проверить.

Для получения дополнительной информации о том, как использовать @time и написать высокопроизводительный код, читайте статью here.