Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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
Arrays 在Julia中对数组的条件赋值进行基准测试_Arrays_Performance_Julia - Fatal编程技术网

Arrays 在Julia中对数组的条件赋值进行基准测试

Arrays 在Julia中对数组的条件赋值进行基准测试,arrays,performance,julia,Arrays,Performance,Julia,我是Julia的新手,我通过以下三种等效方法的基准测试了我的理解:将小于0.5的数组的所有元素设置为0。: using BenchmarkTools function test!(A) @btime begin # method 1 mask = $A .< 0.5 $A[mask] .= 0. end @btime begin # method 2 $A[$A .< 0.5] .= 0. end

我是Julia的新手,我通过以下三种等效方法的基准测试了我的理解:将小于
0.5
的数组的所有元素设置为
0。

using BenchmarkTools

function test!(A)
    @btime begin # method 1
        mask = $A .< 0.5
        $A[mask] .= 0.
    end
    @btime begin # method 2
        $A[$A .< 0.5] .= 0.
    end
    @btime begin # method 3
        @inbounds begin
            for i in eachindex($A)
                if $A[i] < 0.5
                    $A[i] = 0.
                end
            end
        end
    end
end
n = 1000
test!(rand(n,n))
根据我迄今为止读到的关于朱莉娅的资料,我有几个问题:

  • 为什么方法3是最慢的?我希望它是最快的,因为它避免了任何堆分配。我试图查看LLVM/本机代码输出,但这超出了我的理解范围
  • 为什么方法1和方法2同样快?对于我来说,方法1是“Python/Numpy方法”,其中分配用于存储掩码的中间数组是矢量化Numpy编程的典型(不需要的)副产品。我曾期望Julia通过
    操作符将方法2优化为方法3
  • 预期的行为是没有分配和近C快速性能,最好没有显式for循环。我怎样才能做到这一点

  • 谢谢您的时间。

    您的基准测试有点奇怪。如果你改为这样定义3个函数

    function f1(A)
           mask = A .< .5
           A[mask] .= 0
    end
    function f2(A)
        A[A .< .5] .= 0.
    end
    function f3(A)
        @inbounds for i in eachindex(A)
            if A[i] < .5
                A[i] = 0.
            end
        end
    end
    
    函数f1(A)
    面罩=A。<.5
    A[掩码]。=0
    结束
    功能f2(A)
    A[A.<.5].=0。
    结束
    功能f3(A)
    @每个印地安语中i的内边界(A)
    如果A[i]<0.5
    A[i]=0。
    结束
    结束
    结束
    

    @btime
    他们,我知道
    f3
    大约快2倍。

    事实上,这产生了方法3的预期行为。这是因为在我的测试函数中使用了
    $A
    (但我不知道问题在于你重复插值的方式阻止了Julia知道你所有的
    A
    都是相同的方法1和2是相同的,它们都为掩码创建了一个临时数组。如果你想要“融合”广播,你还必须对索引部分进行点播,而这在Julia中是不可能的(至少,现在是这样)。您可以尝试显式使用
    setindex!
    函数。好的,谢谢。我还找到了
    replace!
    函数,它的速度与下面@Oscar Smith的
    f3(A)
    一样快。
    function f1(A)
           mask = A .< .5
           A[mask] .= 0
    end
    function f2(A)
        A[A .< .5] .= 0.
    end
    function f3(A)
        @inbounds for i in eachindex(A)
            if A[i] < .5
                A[i] = 0.
            end
        end
    end