賞金將在 7 天后到期。此問題的答案有資格獲得 50聲望賞金。 ????????正在尋找這個問題的更詳細的答案。
在 Julia中分配一個陣列Union{T, Missing}非常昂貴。有什么解決方法嗎?
julia> @time Vector{Union{Missing, Int}}(undef, 10^7);
0.031052 seconds (2 allocations: 85.831 MiB)
julia> @time Vector{Union{Int}}(undef, 10^7);
0.000027 seconds (3 allocations: 76.294 MiB)
uj5u.com熱心網友回復:
因為如果您使用類似的位型別進行 a Unionof Missing,Int那么 Julia 會設定此類向量最初存盤missing在其每個條目中的標志:
julia> Vector{Union{Missing, Int}}(undef, 10^7)
10000000-element Vector{Union{Missing, Int64}}:
missing
missing
?
missing
missing
如果您使用非位型別,則不必為每個條目設定這樣的標志,如您在此處看到的:
julia> Vector{Union{Missing, String}}(undef, 10^7)
10000000-element Vector{Union{Missing, String}}:
#undef
#undef
?
#undef
#undef
因此性能是相同的:
julia> @btime Vector{Union{String}}(undef, 10^7);
11.672 ms (3 allocations: 76.29 MiB)
julia> @btime Vector{Union{Missing, String}}(undef, 10^7);
11.480 ms (2 allocations: 76.29 MiB)
uj5u.com熱心網友回復:
不同之處在于聯合陣列被零初始化。您可以在此處查看決定這一點的代碼:
https://github.com/JuliaLang/julia/blob/3f024fd0ab9e68b37d29fee6f2a9ab19819102c5/src/array.c#L191
這最終會呼叫memset:
https://github.com/JuliaLang/julia/blob/3f024fd0ab9e68b37d29fee6f2a9ab19819102c5/src/array.c#L144-L145
因此,作為檢查,我們可以比較zeros與分配聯合陣列:
julia> @time Vector{Union{Missing, Int}}(undef, 10^7);
0.020609 seconds (2 allocations: 85.831 MiB)
julia> @time zeros(Int, 10^7);
0.018375 seconds (2 allocations: 76.294 MiB)
相當可比的時間。
但是,我認為這種性能差異最終不會對您的應用程式產生影響,除非您以一種非常奇怪的方式構建它。在分配時間變得微不足道之前,您可以對該陣列進行很少的作業。例如,僅設定未初始化陣列的值會使時間與聯合陣列非常相似:
julia> function f()
a = Vector{Int}(undef, 10^7)
for i in eachindex(a)
a[i] = 1
end
a
end;
julia> function f_union()
a = Vector{Union{Missing, Int}}(undef, 10^7)
for i in eachindex(a)
a[i] = 1
end
a
end;
julia> @time f();
0.015566 seconds (2 allocations: 76.294 MiB)
julia> @time f_union();
0.026414 seconds (2 allocations: 85.831 MiB)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/413263.html
標籤:
