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
更好的名称,同时考虑到所涉及数组的语义。)然后,您可以将此类型的单个变量传递给函数并操作其中的数组,而不是将大量变量传递给每个函数。
这是我第一次尝试使用 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
更好的名称,同时考虑到所涉及数组的语义。)然后,您可以将此类型的单个变量传递给函数并操作其中的数组,而不是将大量变量传递给每个函数。