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

Julia: Best practice for mutating type-stable arrays

这是我第一次尝试使用 Julia,所以如果这对您来说听起来微不足道,请原谅我。我的 Julia 代码已经比我的 Python 代码执行得更好,但我还有一个关于打字的问题。

对于一个科学程序,我正在处理大量类型稳定且维度固定的数组。 该程序旨在通过数学上非常重要的方案更新这些数组,以最小化能量函数。我通过

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

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

在全局范围内将固定维度的类型稳定数组定义为 const,并通过将它们访问为 A[:] 来进行更新是否被视为不良做法?

我最好的替代方法是键入所有函数的输入参数并传递大量变量。这样会更理想吗?

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

但是,如果同一个变量 A 用于保存不同的未连接值(而不是同一矩阵的不同形式,例如简化形式),那肯定是不好的做法。 A[:] .= A .* 2 可以,A[:] .= X 不行。

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

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

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

并在 init 风格的函数中创建一个实例? (希望您能为该类型想出一个比 ArrayVars 更好的名称,同时考虑到所涉及数组的语义。)然后,您可以将此类型的单个变量传递给函数并操作其中的数组,而不是将大量变量传递给每个函数。