将某些常量参数传递给Julia中的函数的最有效方法是什么?

问题描述 投票:0回答:1

假设我具有以下功能

function foo(x::Float64, a::Float64)
    if do_some_intense_stuff(a)
        return bar(x)
    else
        return baz(x)
    end
end

让我们假设在运行时a将是一个常数。但是x不会。我必须多次运行foo(),所以我希望它尽可能快地运行,这意味着尽可能少地运行do_some_intense_stuff。因为a是一个常数,所以在运行时我们知道if语句应采用哪个分支。

所以理想情况下,我将执行以下操作:

foowrapper(x) = foo(x,a)
Y = [foowrapper(x) for x in lots_of_x]

并且将会比]快很多>

Y = [foo(x,a) for x in lots_of_x]

但是事实并非如此。我不怪编译器没有优化我的代码,因为我没有明确告诉它foo()只会用a的常量值来调用。但是我有这样做的好方法吗?

当然,我总是可以摆脱foo并只在全局范围内编写该if语句,但这似乎不太优雅,因为程序的其余部分并不关心do_some_intense_stuff()的输出

假设我有以下函数foo(x :: Float64,a :: Float64)如果do_some_intense_stuff(a)返回bar(x)否则返回baz(x)end end假设在...

function closures julia
1个回答
0
投票

如果a确实是运行时常量和isbits类型,一种选择是将其提升到类型域,所以您可以这样做

© www.soinside.com 2019 - 2024. All rights reserved.