为什么这个20倍以上的已开发Julia代码太慢了?
我认为在Julia中(与R或Matlab不同),开发的代码通常比矢量化的代码快。但我认为情况并非如此。下面是一个例子:为什么这个20倍以上的已开发Julia代码太慢了?,julia,Julia,我认为在Julia中(与R或Matlab不同),开发的代码通常比矢量化的代码快。但我认为情况并非如此。下面是一个例子: julia> x = Float64[1:10000000]; julia> y = Array(Float64, length(x)); julia> @time for i = 1:length(x) y[i] = exp(x[i]) end; elapsed time: 7.014107314 seconds (959983704 bytes all
julia> x = Float64[1:10000000];
julia> y = Array(Float64, length(x));
julia> @time for i = 1:length(x) y[i] = exp(x[i]) end;
elapsed time: 7.014107314 seconds (959983704 bytes allocated, 25.39% gc time)
julia> @time y = exp(x);
elapsed time: 0.364695612 seconds (80000128 bytes allocated)
为什么矢量化代码要快得多?看起来,被开发的代码分配的内存是原来的10倍多。但实际上只需要分配几个字节就可以对任意数量的浮点进行幂运算。有没有一种方法可以编写去因子化代码,这样它就不会分配太多内存,从而比向量化代码运行得更快
谢谢 非常量全局变量速度较慢:
考虑以下代码片段:
x = Float64[1:10000000];
y = Array(Float64, length(x));
function nonglobal_devec!(x,y)
for i = 1:length(x) y[i] = exp(x[i]) end
end
function nonglobal_vec(x)
exp(x)
end
@time nonglobal_devec!(x,y);
@time y = nonglobal_vec(x);
x = Float64[1:10000000];
y = Array(Float64, length(x));
@time for i = 1:length(x) y[i] = exp(x[i]) end
@time y = exp(x)
这给了时代
A: elapsed time: 0.072701108 seconds (115508 bytes allocated)
B: elapsed time: 0.074584697 seconds (80201532 bytes allocated)
C: elapsed time: 2.029597656 seconds (959990464 bytes allocated, 22.86% gc time)
D: elapsed time: 0.058509661 seconds (80000128 bytes allocated)
奇数C表示类型推断不起作用,生成的代码较慢
由于函数在第一次使用时被编译,因此A和B之间的相对计时会有一些变化。如果我们再运行一次,我们将得到
A2: elapsed time: 0.038542212 seconds (80 bytes allocated)
B2: elapsed time: 0.063630172 seconds (80000128 bytes allocated)
这是有道理的,因为A2不分配内存(80字节是函数的返回值),B2创建一个新的向量。还要注意,B2分配的内存量与D分配的内存量相同——第一次分配的额外内存用于编译
最后,devectorized vs vectoriazed是一个个案基础。例如,如果您天真地使用For循环实现矩阵乘法,并且没有缓存感知,那么您可能会比使用BLAS的向量化
A*b
慢得多。“我认为…”您应该始终提供一些证据来支持这种性质的声明。当然,下面是一篇文章,演示了在A2中开发代码的速度有多快Julia:谢谢,Iain,这是一个比我更好的答案。我将劫持这个线程,问一下A2中的80字节是否在每次调用函数时都被分配?例如,如果该函数在一个For循环中调用它10^5次,那么会分配80*10^5字节吗?很确定不会,这很容易检查-它只是一个REPL。不过在REPL的事情很奇怪!如果将该命令放在一个循环中,在REPL处,我认为可能会得到80个字节,这将是循环最后一次的值。