Я не совсем понимаю, как вы получаете результаты теста. Предполагая, что вы хотите 32-битные целые числа, как вы сказали, тогда у нас есть
julia> function mytest(n)
a = Vector{Vector{Int32}}(undef, n)
for i in 1:n
a[i] = cumsum(ones(i))
end
return a
end
mytest (generic function with 1 method)
julia> @btime mytest(20000);
1.108 s (111810 allocations: 3.73 GiB)
Когда мы только избавляемся от этих распределений, мы уже переходим к следующему:
julia> function mytest(n)
a = Vector{Vector{Int32}}(undef, n)
@inbounds for i in 1:n
a[i] = collect(UnitRange{Int32}(1, i))
end
return a
end
mytest (generic function with 1 method)
julia> @btime mytest(20000);
115.702 ms (35906 allocations: 765.40 MiB)
Далее Девекторизация даже не помогает:
julia> function mytest(n)
a = Vector{Vector{Int32}}(undef, n)
@inbounds for i in 1:n
v = Vector{Int32}(undef, i)
v[1] = 1
@inbounds for j = 2:i
v[j] = v[j-1] + 1
end
a[i] = v
end
return a
end
mytest (generic function with 1 method)
julia> @btime mytest(20000);
188.856 ms (35906 allocations: 765.40 MiB)
Но с парой потоков (я предполагаю, что внутренние массивы независимы), мы снова получаем ускорение в 2 раза:
julia> Threads.nthreads()
4
julia> function mytest(n)
a = Vector{Vector{Int32}}(undef, n)
Threads.@threads for i in 1:n
v = Vector{Int32}(undef, i)
v[1] = 1
@inbounds for j = 2:i
v[j] = v[j-1] + 1
end
a[i] = v
end
return a
end
mytest (generic function with 1 method)
julia> @btime mytest(20000);
99.718 ms (35891 allocations: 763.13 MiB)
Но это это примерно так же быстро, как второй вариант выше.
То есть для конкретного c случая cumsum
. Другие внутренние функции, конечно же, работают медленнее, но могут быть одинаково многопоточными и оптимизированы одинаковыми способами, возможно, с другими результатами.
(Это на Julia 1.2, 12 ГБ ОЗУ и более старом i7.)