从性能提示:
在使用参数化类型(包括数组)时,最好尽可能避免使用抽象类型进行参数化。
假设您正在编写一个需要 a 的函数Vector
,并且每次使用该函数时,Vector
都可以包含不同的类型。
function selection_sort!(unsorted_vect::AbstractVector)
# Code to sort.
end
names = String["Sarah","Kathy","Amber"]
unsorted_fibonacci = Int32[8, 1, 34, 21, 3, 5, 0, 13, 2, 1]
selection_sort!(names)
selection_sort!(unsorted_fibonacci)
第一次使用selection_sort!()
时,Vector
包含String
,第二次使用Int32
。
该函数知道它正在获取一个AbstractVector
,但它不知道元素的类型。
selection_sort!(unsorted_vect::AbstractVector{Real})
吗?同一部分还说:
如果您无法避免使用抽象值类型的容器,有时最好使用 Any 进行参数化以避免运行时类型检查。例如 IdDict{Any, Any} 比 IdDict{Type, Vector} 表现更好
function selection_sort!(unsorted_vect::AbstractVector{Any})
如果是这样,为什么排序算法只使用AbstractVector
?
function sort!(v::AbstractVector, # left out other parameters)
你需要的是:
function selection_sort!(unsorted_vect::AbstractVector{T}) where T
# Code to sort.
end
这样,您就有了容器的抽象类型(因此任何容器都将被接受)。然而,这些容器并不是抽象的——因为它们的元素可以有一个具体的类型—— T
。
但是,这只是对参数类型的限制。Julia 会很高兴,function selection_sort!(unsorted_vect)
并且代码也会一样高效。
真正重要的是论点的类型。考虑以下 3 个变量:
a = Vector{Float64}(rand(10))
b = Vector{Union{Float64,Int}}(rand(10))
c = Vector{Any}(rand(10))
a
是类型化容器,b
是小联合类型容器,c
是抽象容器。让我们看看性能发生了什么:
julia> @btime minimum($a);
18.530 ns (0 allocations: 0 bytes)
julia> @btime minimum($b);
28.600 ns (0 allocations: 0 bytes)
julia> @btime minimum($c);
241.071 ns (9 allocations: 144 bytes)
该变量c
需要拆箱(由于未知元素类型),因此性能会降低一个数量级。
总之,真正重要的是参数类型。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句