Arrays 在Julia中对数组的条件赋值进行基准测试
我是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
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))
根据我迄今为止读到的关于朱莉娅的资料,我有几个问题:
操作符将方法2优化为方法3谢谢您的时间。您的基准测试有点奇怪。如果你改为这样定义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