-4 performance julia
我参与的一个研究小组最近决定尝试从我们以前的编码语言迁移到Julia,因为除了其他方面,它声称的高速性能与其他用户友好的语言相比.但是,在我们最初的代码片段翻译中,我的一位合作伙伴注意到,与使用简单的循环技术相比,使用Julia的内置函数(特别是相当简单的函数,如'find')会导致速度下降十倍.有没有其他人遇到过这种情况,还是有其他可能的原因我们应该研究一下?
请原谅对答案的评论,因为我缺乏代表做适当的评论......
我对朱莉娅的理解是,如果你正在钓鱼以获得最佳性能,通常会更好地编写循环.这已经有一段时间了; 例如,见大华林关于表达式表达的帖子.(编辑:但它可能会改变未来,看到的多线程科林T.鲍尔斯的讨论在这里和在下面的评论).
请记住,判断性能可能会非常棘手.我实际上find在我自己的代码中使用了很多,因为我可以简洁地Int在"稀疏" Vector中要求非零的索引,这不是很长.find与等效循环相比,它相对灵活,快速,清晰.例如:
# problem dimensions
p = 10000
k = 10
# a "sparse" vector with k random nonzeroes
b = zeros(p)
b[1:k] = randn(k)
shuffle!(b)
# use `find` to get the indices
@time bidx = find( x -> x .!= 0.0, b)
# is `find` faster than looping?
function find_nonzeroes(b, k)
bnz = zeros(Int,k);
j = 0
@inbounds for i = 1:length(b)
if b[i] .!= 0.0
j += 1
bnz[j] = i
end
j >= k && break
end
return bnz
end
@time bnz = find_nonzeroes(b, k);
# are results same?
println("Return arrays equal? ", isequal(bidx,bnz))
Run Code Online (Sandbox Code Playgroud)
在我的机器上,运行两次后,结果是:
0.001795 seconds (10.03 k allocations: 158.402 KB)
0.004593 seconds (2.57 k allocations: 131.876 KB)
Return arrays equal? true
Run Code Online (Sandbox Code Playgroud)
但是,如果你抬高的尺寸b,说p = 1000000,那么结果有很大的不同:
0.028236 seconds (1.00 M allocations: 15.261 MB, 7.70% gc time)
0.005493 seconds (2.57 k allocations: 131.876 KB)
Return arrays equal? true
Run Code Online (Sandbox Code Playgroud)
该find_nonzeores功能比其更复杂且更不灵活find,但它可以更好地扩展到更高p.在高维度上,权衡可能是值得的,特别是如果您经常调用find代码.
由于您没有提供有关您移植到Julia的详细信息,因此很难为您提供更具体的建议.关于性能提示的Julia页面是我的首选参考,重新重新阅读它经常帮助我提高代码的速度.