Julia:改变类型稳定数组的最佳实践

时间:2018-05-14 18:10:18

标签: arrays types const julia type-stability

这是我在朱莉娅的第一次尝试,所以请原谅我,如果这听起来微不足道。我的Julia代码已经比我的Python代码表现更好了,但是我还有一个关于打字的问题。

对于科学计划,我正在使用大量类型稳定且具有固定维度的阵列。 该计划旨在通过数学上非平凡的方案更新这些阵列,以最小化能量函数。我已经通过

在全局范围内定义了这些数组
const A = Array{Complex{Float32}}(dim)

其中dim是维度。我注意到添加const导致我的计算速度大大提高(x3更快)。随后,这些数组的内容被A[:] =...初始化并在函数中更新。

将全局固定维度的类型稳定数组定义为const,并将A[:]视为不良做法进行更新?

我最好的另一种方法是输入我所有函数的输入参数并传递很多变量。这会更合意吗?

1 个答案:

答案 0 :(得分:1)

我的(主观)意见是将它们定义为const然后改变内容本身并不一定是坏习惯。在Julia中很明显const声明是关于变量值绑定,而不是值的内部。

但是,如果使用相同的变量A来保存不同的未连接值(而不是相同矩阵的不同形式,例如缩小形式),那肯定是不好的做法。 A[:] .= A .* 2很好,A[:] .= X不是。

此外,拥有在不同位置发生变异的多个全局变量通常会产生代码异味,并且通常会导致细微且不那么微妙的错误。它也使代码难以推理。

如何将变量封装在单个struct类型中,例如。

struct ArrayVars 
   A::Array{Complex{Float32}, dim}
   B::Array{Float64, dim}
   ...
end

并在init样式函数中创建该实例? (希望你能为ArrayVars提供一个比 Dim i As Integer = 0 For i = 0 To table.Rows.Count - 1 If table.Rows(i)("Class") Like "*Single*" Then table.Rows(i)("Single") = True End If Next 更好的名称,考虑到所涉及的数组的语义。)然后,你可以将这个类型的单个变量传递给函数并操纵其中的数组而不是将大量变量传递给每个函数。