假设我有这样的代码:
cond = true
a = cond ? 1 : 2
b = ifelse(cond, 1, 2)
两种操作有什么区别?
在你写的例子中,没有任何有效的区别。但是,如果这两个分支比简单的整数字面更复杂,则存在差异:
julia> f() = (println("calling f()!"); 1)
f (generic function with 1 method)
julia> g() = (println("calling g()!"); 2)
g (generic function with 1 method)
julia> cond ? f() : g()
calling f()!
1
julia> ifelse(cond, f(), g())
calling f()!
calling g()!
1
换句话说,ifelse
只是一个普通的函数。就像所有其他函数一样,它的参数是always评价。三元运算符是syntax相当于:
if cond
f()
else
g()
end
请注意,在某些情况下,这可能会导致处理器使用的指令出现差异(即将分支更改为查找),这可能会产生微妙的性能影响,超出两个分支中代码的成本(或者不那么微妙)如果在一个内@simd
循环)...但通常 Julia 和 LLVM 足够聪明,可以在可能的情况下以任何一种方式做最好的事情。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)