首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型效率:数组{ Int64,1}与LinearAlgebra.Adjoint{ Int64,Array{Int64,1}}

类型效率:数组{ Int64,1}与LinearAlgebra.Adjoint{ Int64,Array{Int64,1}}
EN

Stack Overflow用户
提问于 2019-05-23 04:40:08
回答 1查看 108关注 0票数 0

为清晰而编辑!

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

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

代码语言:javascript
复制
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}“

与逗号分隔的元素相比:

代码语言:javascript
复制
julia> a = [1,2,3,4]
4-element Array{Int64,1}:
 1
 2
 3
 4

它生成数组{ type 64,1}类型。

问题:

LinearAlgebra.Adjoint{.}类型在计算上是否比基数组更昂贵?我应该避免在一般意义上生成这个数组吗?(即外部建模线性代数)

在较小的范围内,可能有一个小的差别并不重要,但是,我计划最终在大型数据集上预先形成操作。为了这些目的,我是否应该尝试以数组{I 64,1}类型的形式生成它们?

原创

我一直在学习朱莉娅和我希望尽早养成良好的习惯,注重计算效率。我一直在处理数组,并且在结束时使用单引号来转换成列向量。根据我对类型系统的理解,这不仅仅是一个比逗号组织更快的版本。在一般情况下,使用逗号在计算上更昂贵还是在语义上是不可取的?似乎用较小的数据集并不重要,但更大的数据集又如何呢?(例如10k计算)

代码语言:javascript
复制
Deleted original code example to avoid confusion.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-23 21:43:49

下面是一个性能示例:

代码语言:javascript
复制
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。它也会触发额外的分配和复制,看起来很奇怪,但是如果这对你来说是一件大事,也许它是值得的。

我的建议是:输入逗号。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56268157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档