Julia 中的向量列表比 R 慢?

Øyv*_*rud 6 performance r julia

我试图通过将 R 函数移植到 Julia 来加速它,但令我惊讶的是 Julia 速度较慢。该函数按顺序更新向量列表(Julia 中的数组数组)。事先要更新的列表元素的索引是未知的,新向量的长度是未知的。我编写了一个测试函数来演示该行为。

朱莉娅

function MyTest(n)
  a = [[0.0] for i in 1:n]
    for i in 1:n
      a[i] = cumsum(ones(i))
    end  
  a
end
Run Code Online (Sandbox Code Playgroud)

电阻

MyTest <- function(n){
  a <- as.list(rep(0, n))
  for (i in 1:n) 
    a[[i]] <- cumsum(rep(1, i))
  a
}
Run Code Online (Sandbox Code Playgroud)

通过将 n 设置为 5000、10000 和 20000,典型的计算时间为(21 次测试的中位数):

  • R:0.14、0.45 和 1.28 秒
  • 朱莉娅:0.31、3.38 和 27.03 秒

我使用了带有 64 位 Julia-1.3.1 和 64 位 R-3.6.1 的 Windows 笔记本电脑。

这两个函数都使用 64 位浮点类型。我真正的问题涉及整数,然后 R 更有利。但是整数比较是不公平的,因为 R 使用 32 位整数和 Julia 64 位。在这种情况下,我可以做些什么来加快 Julia 的速度,还是真的 Julia 比 R 慢得多?

Prz*_*fel 0

也许 R 正在为这样简单的函数做某种类型的缓冲?

\n\n

这是带缓冲的 Julia 版本:

\n\n
using Memoize\n@memoize function cumsum_ones(i)\n  cumsum(ones(i))\nend\nfunction MyTest2(n)\n  a = Vector{Vector{Float64}}(undef, n)\n    for i in 1:n\n      a[i] = cumsum_ones(i)\n    end\n  a\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

在热身函数中,计时如下:

\n\n
julia> @btime MyTest2(5000);\n  442.500 \xce\xbcs (10002 allocations: 195.39 KiB)\n\njulia> @btime MyTest2(10000);\n  939.499 \xce\xbcs (20002 allocations: 390.70 KiB)\n\njulia> @btime MyTest2(20000);\n  3.554 ms (40002 allocations: 781.33 KiB)\n
Run Code Online (Sandbox Code Playgroud)\n