我有兴趣了解以下两个函数定义之间的实际差异(如果有的话)
function foo(n::Integer)
println("hello")
end
function foo{T<:Integer}(n::T)
println("hello")
end
Run Code Online (Sandbox Code Playgroud)
据我所知,每次为新类型T调用函数时,第二种形式会触发一个新的编译,但在第一种情况下实际发生了什么?对第一种形式的相关性能有影响吗?
谢谢
函数参数的参数用于方法消歧而不是性能.来自文档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必须都是整数,但它们不必是整数的相同子类型.在第二个功能,既m和n必须是相同的子类型
julia> foo(1, 2)
Parameterized: Int64Int64
julia> foo(1, Int32(1))
Int64Int32
Run Code Online (Sandbox Code Playgroud)