朱莉娅的功能签名

时间:2015-06-16 19:23:02

标签: julia

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

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

function foo{T<:Integer}(n::T)
    println("hello")
end

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

由于

1 个答案:

答案 0 :(得分: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

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

julia> foo(1, 2)
Parameterized: Int64Int64

julia> foo(1, Int32(1))
Int64Int32