Elixir

时间:2016-09-15 20:39:42

标签: python elixir list-comprehension

在Python中,可以执行此操作[e2 for e1 in edits1(word) for e2 in edits1(e1)]。 Elixir中该构造的等效(和正确)形式是什么?

我尝试的是:

def edits2(word) do
  (for e1 <- edits1(word), do: edits1(e1))
  |> Enum.reduce(MapSet.new, fn(item, acc) -> MapSet.union(item, acc) end)
end

但这非常慢,因为它发生了我需要做一个包含数百个列表的MapSet,每个列表包含500多个元素。

1 个答案:

答案 0 :(得分:1)

好的,所以我最初问题的答案正是@Dogbert所建议的:for e1 <- edits1(word), e2 <- edits1(e1), into: MapSet.new, do: e2

但瓶颈并不是这条特殊的路线。有关某些优化,请参阅https://github.com/visar/spell_check/commit/857653593ca98310db028601e9cfc59dc1ac13a4?diff=split,这会在我的计算机上将特定测试的运行时间截断为2秒以下。

杀手是known/1每次重新计算单词键 - 并且有数千个 - 但它可以安全地成为常量,因此编译需要更长的时间,但运行速度要快得多。 / p>