我有一些代码使用@parallel for
循环进行计算,在每次迭代时产生一个输出元组。我想在数组中收集这些元组以进行进一步处理:
n=2
out = @sync @parallel (hcat) for i=1:n
(i, i+1)
end
for i=1:n
(j,k) = out[i]
# do something
end
println("okay")
如果这只是循环的一次迭代,out
是一个元组,而不是一个元组数组,而(j,k) = out[i]
会抛出一个错误。
n=1
out = @sync @parallel (hcat) for i=1:n
(i, i+1)
end
for i=1:n
(j,k) = out[i] # error
# do something
end
println("not reached")
有没有办法可以强制out
成为元组数组而不管n
的值,而不必在循环后对out
进行任何检查?
感谢。
答案 0 :(得分:6)
当您在hcat
上致电Tuple...
时,系统会引导您使用更通用的算法:
julia> @which hcat((1,2))
hcat{T}(X::T...) at abstractarray.jl:710
julia> @which hcat([(1,2)])
hcat{T}(V::Array{T,1}...) at array.jl:690
朱莉娅需要更多时间来hcat
:
julia> @time out = @sync @parallel (hcat) for i=1:10_000
(i, i+1)
end;
0.146527 seconds (4.67 k allocations: 508.905 KB)
julia> @time out = @sync @parallel (hcat) for i=1:10_000
[(i, i+1)]
end;
0.061976 seconds (4.76 k allocations: 513.370 KB)
另外,如果您使用第二种语法,请不要在n=1
:
n=1
out = @sync @parallel (hcat) for i=1:n
[(i, i+1)]
end
for i=1:n
(j,k) = out[i] # OK
# do something
end
答案 1 :(得分:2)
自hcat(hcat(x)) = hcat(x)
以来,但始终是Matrix。你可以添加:
out = hcat(out)
并行循环后。但这似乎是一个黑客。