【问题标题】:Collect array of tuples from for loop从 for 循环中收集元组数组
【发布时间】:2015-11-04 11:05:52
【问题描述】:

我有一些代码使用@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 进行任何检查?

谢谢。

【问题讨论】:

    标签: julia


    【解决方案1】:

    当您在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
    

    朱莉娅需要更多时间来做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
    

    【讨论】:

      【解决方案2】:

      hcat(hcat(x)) = hcat(x) 开始,但始终是一个矩阵。您可以添加:

      out = hcat(out)
      

      在并行循环之后。但这似乎是一个 hack。

      【讨论】:

      • @Reza 的回答:用[(i,i+1)] 替换(i,i+1) 看起来更好。在任何情况下,并行循环超过 1 个元素都应该有一些开销。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-29
      • 2015-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多