Julia 类型效率:数组{Int64,1}与线性代数.伴随{Int64,数组{Int64,1}

Julia 类型效率:数组{Int64,1}与线性代数.伴随{Int64,数组{Int64,1},julia,Julia,为清晰起见进行了编辑 在Julia中有几种方法可以构建/生成数组 我对列向量使用单引号或撇号方法,因为它比[]中的多个逗号更快: julia> a = [1 2 3 4]' 4×1 LinearAlgebra.Adjoint{Int64,Array{Int64,2}}: 1 2 3 4 这生成了我认为更复杂的数据类型:“LinearAlgebra.Adjunct{Int64,Array{Int64,1}” 与逗号分隔的元素相比: julia> a = [1,2,3,4]

为清晰起见进行了编辑

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

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

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

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

与逗号分隔的元素相比:

julia> a = [1,2,3,4]
4-element Array{Int64,1}:
 1
 2
 3
 4
它生成一个数组{Int64,1}类型

问题:

线性代数伴随{…}类型比基数组在计算上更昂贵吗?我应该避免在一般意义上生成此数组吗?(即,线性代数外部建模)

在较小的范围内,可能存在一个小的差异,这无关紧要,但我计划最终在大型数据集上执行操作。为了这些目的,我应该尝试将它们生成为数组{Int64,1}类型吗


原创的

我一直在学习Julia,我想早点养成好习惯;专注于计算效率。我一直在使用数组,并在最后使用单引号表示法将其转换为列向量。从我对类型系统的理解来看,这不仅仅是一个比逗号更快的组织方式。一般来说,使用逗号在计算上更昂贵还是在语义上不受欢迎?较小的数据集似乎无关紧要,但较大的数据集呢?(例如,10k计算)


下面是一个性能示例:

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
如您所见,
向量上的和的性能要比
伴随向量上的和的性能好得多(实际上,我有点惊讶于差异有多大)

但对我来说,使用
向量
的更大原因是,使用复杂且复杂的
伴随
类型似乎既奇怪又不自然。另一个更大的风险是,有些代码不接受
伴随
,然后你就给自己制造了额外的麻烦

但是,真的,为什么要使用
伴随词呢?这只是为了避免使用逗号吗?你输入的向量有多长?如果向量类型对你来说是一个很大的麻烦,你可以考虑写<代码> [1 2 3 3 ] []:/>代码>它将返回<代码>矢量< /代码>。这也会触发额外的分配和复制,看起来很奇怪,但如果这对你来说是一件大事,也许值得


我的建议是:键入逗号。

你能解释一下“逗号”是什么意思吗?@DNF,我想他指的是撇号而不是逗号。但问题是“单引号表示法”和“逗号”之间的区别。如果我的意图是写“撇号”,那我就没什么意义了。哦,好吧,我理解你的评论。然后我相信,逗号是指数组:
[1,2,3]
例如,我认为这个问题非常不清楚,需要重新编写才能理解。尽管您的解释可能是对的,@J.Khamphousone,但我仍然无法说出海报想要什么样的回答,也许除了一篇关于惰性数据结构效率的一般性文章。谢谢您的完整解释。我没想到会有这么大的差别。
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