从for循环中收集元组数组

时间:2015-11-03 20:10:55

标签: 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
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进行任何检查?

感谢。

2 个答案:

答案 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)
并行循环后

。但这似乎是一个黑客。