`ifelse`和三元操作符在Julia中有何区别?

5

假设我有这段代码:

cond = true
a = cond ? 1 : 2
b = ifelse(cond, 1, 2)

这两个操作有什么区别?


1
请注意,您也可以在一行上编写普通的 if 语句。我经常喜欢那种外观。if cond 1 else 2 end - Nathan Boyer
2个回答

8
在您编写的示例中,没有有效的区别。但是,如果这两个分支比简单的整数文字更复杂,则存在差异:
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只是一个普通的函数。就像所有其他函数一样,它的参数总是会被评估。三元运算符在语法上等同于:
if cond
    f()
else
    g()
end

请注意,在某些情况下,这可能导致处理器使用的指令有所不同(即将分支改为查找),这可能会对性能产生微妙的影响,超出了两个分支中代码的成本(或者如果在@simd循环中则不那么微妙)......但通常情况下,如果可能的话,Julia和LLVM会聪明地以最佳方式执行。

1
另一个一般的区别是,ifelse函数可以进行广播。
julia> ifelse.([true, true, false], [1, 1, 1], [0, 0, 0])
3-element Vector{Int64}:
 1
 1
 0

而三元运算符则不能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接