在Julia中,我经常看到代码写成fun(n :: T),其中T:Integer,当函数适用于Integer的所有子类型时.但有时,我也看到有趣(n :: Integer),一些指南声称它等同于上述,而其他人说它效率较低,因为Julia并不
zero(::Type{T}) where {T<:Number} = convert(T,0)
要么
(+)(x::T, y::T) where {T<:BitInteger} = add_int(x, y)
即使您在许多情况下需要类型信息,也足以使用typeof函数.再一个示例定义是:
oftype(x, y) = convert(typeof(x), y)
即使您使用的是参数类型,也可以避免使用where子句(有点冗长),如:
median(r::AbstractRange{<:Real}) = mean(r)
因为你不关心函数体中参数的实际值.
现在 – 如果你是像我这样的朱莉娅用户 – 问题是如何说服自己这是按预期工作的.有以下方法:
>您可以检查一个定义是否覆盖方法表中的另一个定义(即在评估两个定义之后,此函数只存在一个方法);
>您可以使用@code_typed,@ code_warntype,@ code_llvm或@code_native等检查两个函数生成的代码,并发现它是相同的
>最后,您可以使用BenchmarkTools对性能代码进行基准测试
一个很好的情节解释Julia对你的代码做了什么在这里http://slides.com/valentinchuravy/julia-parallelism#/1/1(我也向所有Julia用户推荐整个演示文稿 – 它非常棒).并且您可以看到,在降低AST之后,Julia应用类型推断步骤来专门化LLVM codegen步骤之前的函数调用.
您可以提示Julia编译器以避免专门化.这是使用Julia 0.7上的@nospecialize宏完成的(虽然这只是一个提示).