我正在尝试学习编写良好的茱莉亚代码。我想编写以下统计信息。
(如果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] 删除。
我来说两句