朱莉娅的功能签名

Dav*_*ide 5 julia

我有兴趣了解以下两个函数定义之间的实际差异(如果有的话)

function foo(n::Integer)
    println("hello")
end

function foo{T<:Integer}(n::T)
    println("hello")
end
Run Code Online (Sandbox Code Playgroud)

据我所知,每次为新类型T调用函数时,第二种形式会触发一个新的编译,但在第一种情况下实际发生了什么?对第一种形式的相关性能有影响吗?

谢谢

ptb*_*ptb 5

函数参数的参数用于方法消歧而不是性能.来自文档http://docs.julialang.org/en/latest/manual/style-guide/#avoid-writing-overly-specific-types

要实现的关键是,只定义一般的addone(x)= x + one(x)没有性能损失,因为Julia会根据需要自动编译专用版本.例如,第一次调用addone(12)时,Julia会自动为x :: Int参数编译一个专用的addone函数,并将one()的调用替换为其内联值1.因此,addone的前三个定义以上是完全多余的.

编辑以发表评论:

只有当有多个参数时,两个签名之间的区别才真正明显

考虑两个功能:

julia> function foo(n::Integer, m::Integer)
           println(typeof(n), typeof(m))
       end

julia> function foo{T<:Integer}(n::T, m::T)
           println("Parameterized: ", typeof(n), typeof(m))
       end
Run Code Online (Sandbox Code Playgroud)

在第一个函数中n,m必须都是整数,但它们不必是整数的相同子类型.在第二个功能,既mn必须是相同的子类型

julia> foo(1, 2)
Parameterized: Int64Int64

julia> foo(1, Int32(1))
Int64Int32
Run Code Online (Sandbox Code Playgroud)