【问题标题】:Julia code optimization: vector calculation and taking sumJulia代码优化:向量计算和求和
【发布时间】:2023-04-11 00:29:01
【问题描述】:

我在一个 Julia 项目中,我想在下面的代码中优化我的函数 oneAttempt

下面是我的代码的简要说明:

  • 函数oneAttmept实现一定的递归算法返回终端结果。
  • 变量@ 987654323是通过我在下面的代码中写入的算法更新的变量(我将省略这个问题)。
  • 函数oneAttempt会在for循环下被多次调用(超过1000次)。
function oneAttempt()
            n = 30
            m = 900

            x = rand(Normal(), n, n)
            A = ones(n, n) * sum(sum(x, dims = 1))
    
            # f would be passed to the algorithm below.
            # f0 is the initial value of f
            f0 = ones(n, n) + x - (1 / m) * A
            f = copy(f0)
            o = zeros(n, n)

            #=
            algorithm part:    
            while loop in which f would be updated many times under complicated algorithm 
            =#
            
            return f;
end

# the function `oneAttempt` would be called many times (more than 1000 times) under for loop.

我想有更好的优化方法来制作f0,因为我听说向量计算将是 Julia 编码中的一个普通瓶颈。

有更好的编码方式吗?

任何信息将不胜感激。

【问题讨论】:

    标签: arrays algorithm optimization julia


    【解决方案1】:

    您的示例不是完全独立的,这使得提出改进建议变得更加困难,因为我不知道在不更改其功能的情况下可以更改哪些部分。但总的来说,我会说你的问题是你创建了很多不必要的数组,你的第一个策略应该是减少它。

    例如:

    A = ones(n, n) * sum(sum(x, dims = 1))
    

    这会在内部sum 内创建一个向量,然后将其相加。此外,不需要ones(n, n),它只是更多的分配,没有任何目的。相反,写

    A = sum(x)
    

    这对整个数组 x 求和,不需要数组。 (我怀疑你来自 Matlab,其中 sum(x) 对矩阵的列求和(除非它是一个 1xN 矩阵,在这种情况下它对行求和!),但即使在 Matlab 中你也可以写 sum(x, [], 'all') 而不是 @987654328 @.)

    这里:

    f0 = ones(n, n) + x - (1 / m) * A
    

    您还应该避免不必要的分配。无需创建数组,只需使用广播即可。我会这样写:

    f0 = (1 + A/m) .+ x  # 1 and A/m are both scalar, so don't dot the plus in the parens.
    

    这里

    f = copy(f0)
    o = zeros(n, n)
    

    你创建了更多的数组,带有一个副本和zeros。我不知道它们是做什么用的,但我怀疑你不需要它。如果您添加更多上下文,我可以对此发表评论。

    但总的来说,减少不必要的数组,改用广播,并可能使用就地操作。

    【讨论】:

    • TIL 关于 MATLAB 的 sum(x, [], 'all'! (恕我直言,这也是很好的答案)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多