Julia 中 `zero(eltype(x))` 和 `zero(x)` 之间的区别

Jos*_*asa 5 julia

在《Julia High Performance》(第二版)中,作者给出了以下示例来解释如何在循环中获得类型稳定性:

function simdsum_fixed(x)
    s = zero(eltype(x))
    @simd for v in A
        s += v
    end
    return s
end
Run Code Online (Sandbox Code Playgroud)

在前面的示例中,他们只是使用不同的代码来使用zero(x). 因此,我尝试了相同的功能,但没有eltype()如下所示(simdsum_fixed_b)。他们似乎以同样的方式工作。

function simdsum_fixed_b(x)
    s = zero(x)
    @simd for v in A
        s += v
    end
    return s
end
Run Code Online (Sandbox Code Playgroud)

那么与 有何zero(eltype(x))不同zero(x)?使用第一个比使用第二个有什么优势?

提前致谢。

Bog*_*ski 9

zero(eltype(x))如果x是一个容器(例如向量)并且您想要其元素的附加标识,请使用。zero(x)如果您想获得其自身的附加身份,请使用x

以向量为例,这里的差异是最明显可见的:

julia> x = [1, 2, 3]
3-element Vector{Int64}:
 1
 2
 3

julia> zero(x)
3-element Vector{Int64}:
 0
 0
 0

julia> zero(eltype(x))
0
Run Code Online (Sandbox Code Playgroud)