Для полноты картины воспользуйтесь Micro-Benchmark, который показывает еще одно решение: используйте версии на месте uniq!
, которые будут немного быстрее.
Если можно изменить исходный массив, вы также можете использовать
array.flatten!
array.uniq!
но имейте в виду, что это изменяет array
, и это может быть нежелательным, особенно если это параметр метода.
Вот микропроцессор:
require "benchmark/ips"
# ARRAY = [[], [1], [2], [1, 3, 2], [4, 5, 6, 7, 8, 1], [2, 4], [3], [2]].freeze
ARRAY = [[], [1], [2], [1, 3, 2], [4, 5, 6, 7, 8, 1], [2, 4], [3], [2], [], [1], [2], [1, 3, 2], [4, 5, 6, 7, 8, 1], [2, 4], [3], [2], [], [1], [2], [1, 3, 2], [4, 5, 6, 7, 8, 1], [2, 4], [3], [2], [], [1], [2], [1, 3, 2], [4, 5, 6, 7, 8, 1], [2, 4], [3], [2],[], [1], [2], [1, 3, 2], [4, 5, 6, 7, 8, 1], [2, 4], [3], [2]].freeze
Benchmark.ips do |x|
x.compare!
x.report("flatten.uniq") { ARRAY.flatten.uniq }
x.report("flatten.uniq!") { ARRAY.flatten.uniq! }
x.report("reduce") { ARRAY.reduce([]) { |acc, e| acc | e } }
end
И вот результаты:
Comparison:
flatten.uniq!: 107888.3 i/s
flatten.uniq: 105813.6 i/s - same-ish: difference falls within error
reduce: 49892.6 i/s - 2.16x slower
Обратите внимание, что вариант reduce
может быть на самом деле быстрее, если элементов меньше.Но он будет работать только с одним уровнем вложенности, тогда как другие версии будут работать для всех уровней.Так что [[[1]]]
не будет работать с вариантом reduce
.