有没有办法重构下面的julia代码,以避免循环/ malloc?

时间:2017-07-11 17:00:40

标签: performance malloc profiling julia

m,n =size(l.x)
for batch=1:m
  l.ly = l.y[batch,:]
  l.jacobian .= -l.ly .* l.ly'
  l.jacobian[diagind(l.jacobian)] .= l.ly.*(1.0.-l.ly)
  # # n x 1 = n x n * n x 1
  l.dldx[batch,:] = l.jacobian * DLDY[batch,:]
end
return l.dldx

l.xmn矩阵。 l.y是另一个与l.x大小相同的矩阵。我的目标是通过m矩阵n创建另一个l.dldx,其中每一行都是for循环内操作的结果。任何人都可以对这段代码进行进一步的优化吗?上面的代码是https://github.com/stevenygd/NN.jl的一部分。

1 个答案:

答案 0 :(得分:1)

以下内容应实现相同的计算并且效率更高:

l.dldx = l.y .* (DLDY .- sum( l.y .* DLDY , 2))

通过将sum重构为循环,可能会有轻微的改进。

由于问题没有可运行的代码或测试用例,因此很难给出明确的基准,所以欢迎反馈。

更新

以上是带有显式循环的代码:

function calc_dldx(y,DLDY)
    tmp = zeros(eltype(y),size(y,1))
    dldx = similar(y)
    @inbounds for j=1:size(y,2)
        for i=1:size(y,1)
            tmp[i] += y[i,j]*DLDY[i,j]
        end
    end
    @inbounds for j=1:size(y,2)
        for i=1:size(y,1)
            dldx[i,j] = y[i,j]*(DLDY[i,j]-tmp[i])
        end
    end
    return dldx
end

长版应该运行得更快。衡量代码性能的一个好方法是使用BenchmarkTools包。