Ruby数组映射(&:flatten)导致延迟问题

时间:2018-10-25 14:57:53

标签: ruby performance

我有一个如下的多维数组

arr = [["2", "3", "1"], ["5", "2", "6", "1", "4", "3"], ["2", "5", "1", "3", "6", "4"], ["2", "3", "1"], ["2", "3", "1"], ["1", "2", "3"]]

我想生成一个组合并将其展平,如下所示。

[["2", "5", "2", "2", "2", "1"], ["2", "5", "2", "2", "2", "2"], ["2", "5", "2", "2", "2", "3"], ["2", "5", "2", "2", "3", "1"], ["2", "5", "2", "2", "3", "2"], ["2", "5", "2", "2", "3", "3"],..., ["1", "3", "4", "1", "1", "3"]]

代码如下

comb = arr.inject(&:product)
flat_arr = comb.map(&:flatten)

flat_arr = comb.map(&:flatten)5ms-8ms附近。我有很多这样的阵列,这会导致延迟问题。有办法减少吗?

2 个答案:

答案 0 :(得分:3)

您完全可以摆脱扁平化,

Benchmark.bm(7) do |bm|
  bm.report("inject") { n.times { arr.inject(&:product).map(&:flatten) }}
  bm.report("product splat") { n.times { arr[0].product(*arr[1..-1]) } }
end
                   user     system      total        real
inject         3.390163   0.003636   3.393799 (  3.397507)
product splat  0.514577   0.000000   0.514577 (  0.514595)

arr.inject(&:product).map(&:flatten) == arr[0].product(*arr[1..-1])
 => true

答案 1 :(得分:0)

this GitHub正在比较几种方法的I / O速度。也许您可以尝试使用flat_map方法来优化上一个操作。