朱莉娅:优化功能

布迪奥诺维奇

我正在尝试学习编写良好的茱莉亚代码。我想编写以下统计信息。

(如果A为true,请注意1 {A} = 1,如果A为false,则为0)

在此处输入图片说明

在哪里

在此处输入图片说明

在此处输入图片说明

function cohens_kappa(x::Vector{Int}, k::Int)
  support = unique(x)
  m = length(support)
  n = length(x)
  y = BitArray(n, m)
  for j in eachindex(support)
    y[:,j] = (X .== support[j])
  end

  num = 0.0
  den = 0.0
  for j in eachindex(support)
    pjjk = sum(y[(1 + k):n, j] & y[1:(n - k), j]) / (n - k)
    pj = sum(y[:, j]) / n

    num += pjjk - pj ^ 2
    den += (1 / m) - pj ^ 2
  end
  return (num / den)
end

这是最有效的编码方式吗?

编辑:谢谢所有的建议。您能解释一下为什么您的代码更有效吗?我想学习将来如何继续编写好的代码。

针对@ user3580870的两个示例

@time [cohens_kappa(X, k) for k in 1:15]
  0.000507 seconds (1.58 k allocations: 269.016 KB)

@time [cohens_kappa2(X, k) for k in 1:15]
  0.000336 seconds (166 allocations: 12.375 KB)

@time [cohens_kappa3(X, k) for k in 1:15]
  0.000734 seconds (303 allocations: 84.109 KB)

看来您的第二个建议没有那么快,但是分配的数量比我的原始版本少,因此对于非常大的向量可能更快。

和盖茨

这是另一个版本,具有重大改进:

   function cohens_kappa2(x::Vector{Int}, k::Int)
     d = Dict{Int,Int}()
     n = length(x)
     c1 = Int[]
     pnew = 0
     for i=1:n
       p = get(d,x[i],0)
       if p>0
         c1[p] += 1
       else
         pnew += 1
         d[x[i]] = pnew
         push!(c1,1)
       end
     end
     c2 = zeros(Int,pnew)
     for i=(k+1):n
       if x[i-k]==x[i] c2[d[x[i]]] += 1 ; end
     end
     num, dentmp = 0.0, 0.0
     for i=1:pnew
       pjjk = c2[i]/(n-k)
       pj = c1[i] / n
       num += pjjk - pj^2
       dentmp += pj^2
     end
     return (num / (1.0-dentmp))
   end

通常,优化几乎总是可能的,但是就像从自然界中提取石油一样,它伴随着程序员不断增加的成本和工作量。

在一个测试案例中,上述情况使我的速度提高了5到10倍。您的数据结果如何?

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章