Эликсир Enum.map против понимания - PullRequest
2 голосов
/ 07 марта 2019

У меня есть карта, и я изменяю каждый элемент на ней, я не понимаю, какой подход лучше (быстрее) сделать с Enum.map, а затем Enum.into(%{}) или использовать для понимания типа

for {key, value} <- my_map, into: %{} do
  {key, new_value}
end

1 Ответ

4 голосов
/ 07 марта 2019

Вы можете использовать Benchee для проведения такого рода сравнений.

Простой тест Бенчи покажет, что Enum быстрее в таких случаях, как этот.

iex(1)> m = %{a: 1, b: 2, c: 3, d: 4}
%{a: 1, b: 2, c: 3, d: 4}
iex(2)> with_enum = fn -> Enum.map(m, fn {k, v} -> {k, v * v} end) end
#Function<20.127694169/0 in :erl_eval.expr/5>
iex(3)> with_for = fn -> for {k, v} <- m, into: %{}, do: {k, v * v} end
#Function<20.127694169/0 in :erl_eval.expr/5>
iex(4)> Benchee.run(%{
...(4)>   "with_enum" => fn -> with_enum.() end,
...(4)>   "with_for" => fn -> with_for.() end
...(4)> })
Operating System: Linux
CPU Information: Intel(R) Core(TM) i7-6500U CPU @ 2.50GHz
Number of Available Cores: 4
Available memory: 7.71 GB
Elixir 1.7.4
Erlang 21.0

Benchmark suite executing with the following configuration:
warmup: 2 s
time: 5 s
memory time: 0 ns
parallel: 1
inputs: none specified
Estimated total run time: 14 s


Benchmarking with_enum...
Benchmarking with_for...

Name                ips        average  deviation         median         99th %
with_enum       28.27 K       35.37 μs    ±16.16%       34.37 μs       55.21 μs
with_for        19.55 K       51.14 μs     ±9.16%       50.08 μs       59.94 μs

Comparison: 
with_enum       28.27 K
with_for        19.55 K - 1.45x slower

В общем, for не лучший вариант для этих случаев в Elixir, он лучше всего подходит для понимания списков, что он может делать довольно быстро и с легким для чтения синтаксисом.

Функции

Enum оптимизированы для обработки этих сценариев, которые являются более итеративными, как, например, то, что вы делаете с конструкцией for в других языках программирования.

...