Карта массивов Ruby (&: flatten) вызывает проблему задержки - PullRequest
0 голосов
/ 25 октября 2018

У меня есть многомерный массив, как показано ниже

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 голосов
/ 25 октября 2018

Вы можете полностью избавиться от сплющивания,

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
0 голосов
/ 25 октября 2018

этот GitHub сравнивает скорость ввода / вывода нескольких методов.Возможно, вы можете попробовать этот flat_map метод для оптимизации вашей последней операции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...