在Julia,我有一个复杂模拟函数,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
写为here ?这是否更好?不过,我会传递的信息比我在这种情况下所需要的更多。
答案 0 :(得分:3)
由于谷歌带我到这里,也许我添加评论:
嵌套函数过去比较慢,请参阅2013年github上的this discussion ...但不是更多:在v0.6上运行完全相同的测试,它们现在都是相同的速度。
如果(如问题)内部函数隐式地依赖于外部函数中定义的事物,那么对于我来说这仍然是正确的,如果它是独立函数则必须明确地传递。
答案 1 :(得分:2)
正如您所提到的,代码清晰度非常重要,因此您应该首先关注它。如果你觉得功能中的功能是你的风格,并帮助你(和你的同事)更好地理解你的脚本。
至于性能,您始终可以使用@time
宏来比较这两种实现。我不希望看到你在功能实现中的功能受到影响,但总是值得检查。
有关如何使用@time
和编写高性能代码的详细信息,请阅读文章here。