我有一些代码使用 @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< 进行任何检查
在循环之后?
谢谢。
最佳答案
当你在 Tuple...
上调用 hcat
时,你将被引导到一个更通用的算法:
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
而且 Julia 需要更多时间来执行 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
关于julia - 从 for 循环中收集元组数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33508161/