在朱莉娅,我有一个复杂的模拟函数,monte_carlo_sim(),涉及许多参数。在这个函数中,我需要调用许多其他函数。我可以在monte_carlo_sim()之外编写独立的函数,但是接下来我需要传递许多参数--其中许多参数在函数中是常量--这些参数将牺牲优雅和清晰(也许不会利用这些常量变量这一事实?)在功能中不包含函数是否有性能原因?作为一个玩具例子,温度T是恒定的,如果我不想把这个变量传递给我的函数compute_Boltzmann(),我可以这样做。这个有什么问题吗?
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或者,我可以定义一个新的const类型SimulationParameters并将其传递给compute_Boltzmann,并将compute_Boltzmann写到monte_carlo_sim函数之外作为这里吗?这样更好吗?不过,在这种情况下,我会传递比我需要的更多的信息。
发布于 2017-07-10 16:11:27
既然谷歌带领我来到这里,或许我要补充一条评论:
嵌套函数以前比较慢,例如参见github上的这一讨论 .2013年。但是现在没有了:在0.6版上运行测试,它们现在的速度都是一样的。
如果(像问题一样)内部函数隐式地依赖于在外部函数中定义的东西,如果它是一个独立的函数,就必须显式地传递它,这对我来说仍然是正确的。
发布于 2016-03-23 09:54:25
正如您所提到的,代码清晰是非常重要的,所以您应该首先关注这一点。如果您觉得函数中的功能是您的风格,并帮助您(和您的同事)更好地理解您的脚本,而不是这样做。至于性能,您可以使用@time宏来比较这两个实现。我不希望看到函数实现中的函数会受到影响,但它总是值得检查的。
有关如何使用@time和编写高性能代码的更多信息,请阅读文章这里。
https://stackoverflow.com/questions/36164367
复制相似问题