在Julia中高效实现数值积分

时间:2019-02-28 14:59:34

标签: performance julia integration

我正在编码一种算法,其中我必须集成两个函数(costOfNextPeriods和pdf)的乘积。因为两个函数都有多个参数,所以我将它们包装到一个具有一个参数的函数中。我的问题是知道我最关心算法的性能,这是否有效。这样在作用域内定义函数好吗?

function expCost(y::Float64, period::Int, instance::Instance, pwla::Pwla)
    dist = instance.distributions[period]
    functionToIntegrate(demand) = costOfNextPeriods(y, demand, period+1, instance, pwla)*pdf(dist,demand)
    return quadgk(functionToIntegrate,0,Inf)[1]
end

谢谢

1 个答案:

答案 0 :(得分:3)

假设正确定义了InstancePwla类型以及costOfNextPeriods函数(即Julia编译器可以在其上插入具体类型),那么您使用的模式应该是有效的。您可以在函数上运行@code_warntype以确保确实如此(如果在某个问题上出现Any red 墨水输出)。如果您发布了完全可复制的示例,那么我可以向您展示如何进行检查。

但是,请注意,如果在代码的较热部分中使用expCost函数,则效率不高。原因是quadgk函数本身不是类型稳定的(我假设您使用QuadGK.jl包中的quadgk函数)。因此,Julia编译器无法推断expCost的返回类型。在这种情况下,最好像这样明确声明函数返回类型:

function expCost(some_arguments...)::Float64
    # whatever you do internally
end

(这里我将返回值注释为Float64,但请将其更改为您期望的返回值类型)

此外,当您在@code_warntype函数上运行expCost时,我确定您会看到这种返回值类型的不稳定性,用 red 墨水表示为Any。 / p>