Julia 从for循环收集元组数组
我有一些代码使用Julia 从for循环收集元组数组,julia,Julia,我有一些代码使用@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 ou
@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
进行任何检查
谢谢。因为hcat(hcat(x))=hcat(x)
但始终是一个矩阵。你可以加上:
out = hcat(out)
在并行循环之后。但这看起来像是一种黑客行为。当您在
元组…
上调用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
@雷扎的回答是:用[(i,i+1)]
取代(i,i+1)
看起来更好。在任何情况下,在1个元素上并行循环都会带来一些开销。