我有一个如下的多维数组
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
附近。我有很多这样的阵列,这会导致延迟问题。有办法减少吗?
答案 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
方法来优化上一个操作。