Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这个20倍以上的已开发Julia代码太慢了?_Julia - Fatal编程技术网

为什么这个20倍以上的已开发Julia代码太慢了?

为什么这个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中(与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 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个字节,这将是循环最后一次的值。