逐元素操作数组 julia
Element wise operations array julia
我是 julia 的新用户,我想了解在 julia 中编写快速代码的最佳实践是什么。我主要在 arrays/matrices 中进行元素明智的操作。我尝试了一些代码来检查哪个可以让我获得更高的速度
fbroadcast(a,b) = a .*= b;
function fcicle(a,b)
@inbounds @simd for i in eachindex(a)
a[i] *= b[i];
end
end
a = rand(100,100);
b = rand(100,100);
@btime fbroadcast(a,b)
@btime fcicle(a,b)
使用for函数实现广播版速度的2倍左右。这两种情况有什么区别?我希望广播在内部循环操作,与我在 fcicle 上所做的非常相似。
最后,有没有什么方法可以使用像 a .*= b?
这样的短语法来达到最佳速度?
非常感谢,
迪伦
我没想到会这样。这可能是性能错误吗?
同时,本例中出现的广播性能问题似乎只出现在二维数组中。以下看起来像一个丑陋的 hack,但它似乎恢复了性能:
function fbroadcast(a,b)
a, b = reshape.((a, b), :) # convert a and b to 1D vectors
a .*= b
end
function fcicle(a,b)
@inbounds @simd for i in eachindex(a)
a[i] *= b[i];
end
end
julia> using BenchmarkTools
julia> a = rand(100, 100);
julia> b = rand(100, 100);
julia> @btime fbroadcast($a, $b);
121.301 μs (4 allocations: 160 bytes)
julia> @btime fcicle($a, $b);
122.012 μs (0 allocations: 0 bytes)
我是 julia 的新用户,我想了解在 julia 中编写快速代码的最佳实践是什么。我主要在 arrays/matrices 中进行元素明智的操作。我尝试了一些代码来检查哪个可以让我获得更高的速度
fbroadcast(a,b) = a .*= b;
function fcicle(a,b)
@inbounds @simd for i in eachindex(a)
a[i] *= b[i];
end
end
a = rand(100,100);
b = rand(100,100);
@btime fbroadcast(a,b)
@btime fcicle(a,b)
使用for函数实现广播版速度的2倍左右。这两种情况有什么区别?我希望广播在内部循环操作,与我在 fcicle 上所做的非常相似。 最后,有没有什么方法可以使用像 a .*= b?
这样的短语法来达到最佳速度?非常感谢, 迪伦
我没想到会这样。这可能是性能错误吗?
同时,本例中出现的广播性能问题似乎只出现在二维数组中。以下看起来像一个丑陋的 hack,但它似乎恢复了性能:
function fbroadcast(a,b)
a, b = reshape.((a, b), :) # convert a and b to 1D vectors
a .*= b
end
function fcicle(a,b)
@inbounds @simd for i in eachindex(a)
a[i] *= b[i];
end
end
julia> using BenchmarkTools
julia> a = rand(100, 100);
julia> b = rand(100, 100);
julia> @btime fbroadcast($a, $b);
121.301 μs (4 allocations: 160 bytes)
julia> @btime fcicle($a, $b);
122.012 μs (0 allocations: 0 bytes)