类型效率:Array {Int64,1}与VERSUS LinearAlgebra.Adjoint {Int64,Array {Int64,1}}

时间:2019-05-23 04:40:09

标签: julia

为清晰起见而编辑!

在Julia中有几种方法可以构建/生成数组。

我一直对列向量使用单引号或撇号方法,因为它比[]内的多个逗号要快:

julia> a = [1 2 3 4]'
4×1 LinearAlgebra.Adjoint{Int64,Array{Int64,2}}:
 1
 2
 3
 4

这正在生成我认为是更复杂的数据类型:“ LinearAlgebra.Adjoint {Int64,Array {Int64,1}}”

与逗号分隔的元素相比:

julia> a = [1,2,3,4]
4-element Array{Int64,1}:
 1
 2
 3
 4

会生成Array {Int64,1}类型。

问题:

LinearAlgebra.Adjoint {...}类型比基本数组在计算上更昂贵吗?我应该避免从一般意义上生成此数组吗?(即在外部建模线性代数的情况下)

在较小的范围内可能会有很小的差异,但这无关紧要,但是,我计划最终对大型数据集执行操作。为此,我是否应该尝试与将它们生成为Array {Int64,1}类型保持一致?


原始

我一直在学习Julia,我想早日养成良好的习惯;专注于计算效率。我一直在使用数组,并且对最后的单引号表示满意,可以转换为列向量。根据我对类型系统的了解,这不仅是比逗号组织方式更快的版本。通常使用逗号在计算上更昂贵还是在语义上不理想?似乎较小的数据集无关紧要,但是较大的数据集又如何呢?(例如10k计算)

Deleted original code example to avoid confusion.

1 个答案:

答案 0 :(得分:1)

以下是一个性能示例:

julia> a = rand(10^6);

julia> b = rand(1, 10^6)';

julia> typeof(a)
Array{Float64,1}

julia> typeof(b)
Adjoint{Float64,Array{Float64,2}}

julia> @btime sum($a)
  270.137 μs (0 allocations: 0 bytes)
500428.44363296847

julia> @btime sum($b)
  1.710 ms (0 allocations: 0 bytes)
500254.2267732659

如您所见,Vector上的总和的性能比Adjoint上的总和的性能要好得多(我实际上对差异有多大感到惊讶)。 / p>

但是对我来说,使用Vector的更大原因是使用复杂而复杂的Adjoint类型似乎很奇怪和不自然。某些代码不接受Adjoint的风险也更大,然后您为自己带来了更多麻烦。

但是,实际上,为什么要使用Adjoint?只是为了避免用逗号书写?您要输入这些向量多长时间?如果矢量键入对您来说是一个很大的麻烦,则可以考虑编写[1 2 3 4][:],它将返回一个Vector。还会触发额外的分配和复制,看起来很奇怪,但是如果这对您来说很重要,也许值得。

我的建议:输入逗号。