I tried using broadcast for computing the radicals of integers 1 to limit. But it was significantly slower than the for loop version. Am I doing something wrong? I tried map! but I’m not sure if I got it right so please include that as well (and any other not so complicated alternative).
function getradicals(limit)
radicals = ones(Int, limit)
for i ∈ Iterators.filter(x -> isone(radicals[x]), 2:length(radicals))
radicals[i:i:end] .*= i
#for j ∈ i:i:length(radicals)
# radicals[j] *= i
#end
end
radicals
end
Broadcasting *=
doesn’t seem to be a problem, but you’re allocating a temporary array at each iteration i
when saying radicals[i:i:end]
. You can avoid this by either using @views
or the loop you’ve commented out.
julia> using BenchmarkTools
julia> function getradicals1(limit)
radicals = ones(Int64, limit)
for i ∈ Iterators.filter(x -> isone(radicals[x]), 2:length(radicals))
radicals[i:i:end] .*= i
#for j ∈ i:i:length(radicals)
# radicals[j] *= i
#end
end
radicals
end
getradicals1 (generic function with 1 method)
julia> @btime getradicals1(100);
1.560 μs (26 allocations: 4.33 KiB)
julia> function getradicals2(limit)
radicals = ones(Int64, limit)
for i ∈ Iterators.filter(x -> isone(radicals[x]), 2:length(radicals))
@views radicals[i:i:end] .*= i
#for j ∈ i:i:length(radicals)
# radicals[j] *= i
#end
end
radicals
end
getradicals2 (generic function with 1 method)
julia> @btime getradicals2(100);
824.390 ns (1 allocation: 896 bytes)
julia> function getradicals3(limit)
radicals = ones(Int64, limit)
for i ∈ Iterators.filter(x -> isone(radicals[x]), 2:length(radicals))
#radicals[i:i:end] .*= i
for j ∈ i:i:length(radicals)
radicals[j] *= i
end
end
radicals
end
getradicals3 (generic function with 1 method)
julia> @btime getradicals3(100);
414.065 ns (1 allocation: 896 bytes)
1 Like
I read somewhere that a += b is converted to a = a + b. I only realized it after using @views. Thanks!
Additional but related question. How would I use broadcasting for something like
radicals[j] -= radicals[j] \div i
instead of
radicals[j] *= i
in the inner loop?
This seems to work
@. @views radicals[i:i:end] -= radicals[i:i:end] \div i