为清晰而编辑!
在Julia中有几种构建/生成数组的方法。
对于列向量,我一直使用单引号或撇号方法,因为它比[]中的多个逗号更快:
julia> a = [1 2 3 4]'
4×1 LinearAlgebra.Adjoint{Int64,Array{Int64,2}}:
1
2
3
4这产生了我认为更复杂的数据类型:"LinearAlgebra.Adjoint{Int64,Array{Int64 64,1}“
与逗号分隔的元素相比:
julia> a = [1,2,3,4]
4-element Array{Int64,1}:
1
2
3
4它生成数组{ type 64,1}类型。
问题:
LinearAlgebra.Adjoint{.}类型在计算上是否比基数组更昂贵?我应该避免在一般意义上生成这个数组吗?(即外部建模线性代数)
在较小的范围内,可能有一个小的差别并不重要,但是,我计划最终在大型数据集上预先形成操作。为了这些目的,我是否应该尝试以数组{I 64,1}类型的形式生成它们?
原创
我一直在学习朱莉娅和我希望尽早养成良好的习惯,注重计算效率。我一直在处理数组,并且在结束时使用单引号来转换成列向量。根据我对类型系统的理解,这不仅仅是一个比逗号组织更快的版本。在一般情况下,使用逗号在计算上更昂贵还是在语义上是不可取的?似乎用较小的数据集并不重要,但更大的数据集又如何呢?(例如10k计算)
Deleted original code example to avoid confusion.发布于 2019-05-23 21:43:49
下面是一个性能示例:
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上的和好得多(实际上,我对两者之间的差异有多大感到惊讶)。
但对我来说,使用Vector的更大原因是,使用复杂而复杂的Adjoint类型似乎很奇怪和不自然。另外,一些代码不接受Adjoint的风险也要大得多,然后您就为自己制造了额外的麻烦。
但是,说真的,为什么要使用Adjoint呢?只是为了避免用逗号写吗?你要输入这些向量多长时间?如果向量输入对您来说是一个很大的麻烦,您可以考虑编写[1 2 3 4][:],它将返回一个Vector。它也会触发额外的分配和复制,看起来很奇怪,但是如果这对你来说是一件大事,也许它是值得的。
我的建议是:输入逗号。
https://stackoverflow.com/questions/56268157
复制相似问题