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