从for循环中收集元组数组

Mic*_*ith 2 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")
Run Code Online (Sandbox Code Playgroud)

如果这里只是循环的一次迭代,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")
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以强制out成为一个元组数组而不管它的值如何n,而不必out在循环后进行任何检查?

谢谢.

Rez*_*lan 6

当您打电话hcatTuple...,您将被引导到更通用的算法:

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
Run Code Online (Sandbox Code Playgroud)

朱莉娅需要更多的时间来做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)
Run Code Online (Sandbox Code Playgroud)

另外,如果您使用第二种语法,则在以下情况下不会出现错误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
Run Code Online (Sandbox Code Playgroud)