Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Julia函数中的函数_Julia - Fatal编程技术网

Julia函数中的函数

Julia函数中的函数,julia,Julia,在Julia中,我有一个用于复杂模拟的函数,monte\u carlo\u sim(),它涉及许多参数。在这个函数中,我需要调用许多其他函数。我可以在monte_carlo_sim()之外编写独立函数,但随后我需要传递许多参数——其中许多参数在该函数中是常量——这将牺牲优雅性和清晰性(可能不会利用这些是常量变量的事实?)。是否存在不在函数中包含函数的性能原因?作为这里的一个玩具示例,温度T是恒定的,如果我不想将这个变量传递给我的函数compute\u Boltzmann(),我可以执行以下操作。

在Julia中,我有一个用于复杂模拟的函数,
monte\u carlo\u sim()
,它涉及许多参数。在这个函数中,我需要调用许多其他函数。我可以在
monte_carlo_sim()
之外编写独立函数,但随后我需要传递许多参数——其中许多参数在该函数中是常量——这将牺牲优雅性和清晰性(可能不会利用这些是常量变量的事实?)。是否存在不在函数中包含函数的性能原因?作为这里的一个玩具示例,温度
T
是恒定的,如果我不想将这个变量传递给我的函数
compute\u 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

或者,我可以定义一个新的常量类型
SimulationParameters
,并将其传递给
compute\u Boltzmann
,然后将
compute\u Boltzmann
写入
monte\u carlo\u sim
函数之外?这样更好吗?不过,在这种情况下,我会传递比我需要的更多的信息。

正如您所提到的,代码的清晰性非常重要,因此您应该首先关注这一点。如果您觉得函数中的函数是您的风格,并且有助于您(和您的同事)更好地理解脚本。 至于性能,您始终可以使用
@time
宏比较这两种实现。我不希望看到函数实现中的函数受到影响,但这总是值得检查的


有关如何使用
@time
和编写高性能代码的更多信息,请阅读本文

既然谷歌把我带到了这里,也许我要添加一条评论:

嵌套函数过去速度较慢,请参见github上的示例。。。2013年。但不再是了:在v0.6上运行完全相同的测试,它们现在都是相同的速度


对于我来说,如果(像问题一样)内部函数隐式地依赖于外部函数中定义的事物,那么这仍然是正确的,如果它是一个独立函数,则必须显式地传递外部函数

谷歌也把我带到了这里,正是因为嵌套函数对我的性能有很大的影响。这可能是因为嵌套函数返回多个参数。