我正在编码一种算法,其中我必须集成两个函数(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
谢谢
答案 0 :(得分:3)
假设正确定义了Instance
和Pwla
类型以及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>