gpt4 book ai didi

elixir - 在Elixir中串联多个列表

转载 作者:行者123 更新时间:2023-12-04 16:51:10 28 4
gpt4 key购买 nike

我正在学习Elixir,发现自己不得不在我有一个开始,中间和结尾的地方合并多个列表。简化示例:

a = [1,2]
b = [3,4]
c = [5,6]
a ++ b ++ c
> [1, 2, 3, 4, 5, 6]

我正在流中执行数千次此操作,并且希望对此具有万能药的作用。

第1部分)

我编写了一个函数来处理此问题,可能有一些事情可以帮我实现,但我看不到。我应该为此使用内置的Elixir功能吗?
def append(front, back) when is_list(front) when is_list(back) do
front
|> Enum.reverse
|> Enum.reduce(back, &([&1 | &2]))
end

还是我应该这样做,随着时间的推移,它对我来说将变得更加自然?
[1, 2]
|> Enum.reverse
|> Enum.reduce([3, 4], &([&1 | &2]))
|> Enum.reverse
|> Enum.reduce([5, 6], &([&1 | &2]))

第2部分)

我一起叫零件的顺序重要吗?
Way 1:
[1, 2]
|> append([3, 4])
|> append([5, 6])

...
Way 2:
end = append([3, 4], [5, 6])
append([1, 2], end)

由于两种情况都将添加头指针,因此在这两种情况下,中间人列表都可以重用吗?

对此,任何帮助都会很棒。

最佳答案

无论使用哪种方法,最终都将克隆至少一个列表(最后一个列表除外),因为您不能在不克隆链表的情况下附加到链表。因此,如果您知道要串联列表(即您不能修改代码以接受像[a, b, c]这样的嵌套列表),我建议使用a ++ b ++ c,因为++是在Erlang的C代码中实现的,它应该尽可能快地完成,并且绝对比手动连接Enum.reverse/1Enum.reduce/3更快。

这是一个比较a ++ b ++ ca |> append(b) |> append(c)的微型基准测试:

defmodule BasicBench do
use Benchfella

bench "++", [a: gen(), b: gen(), c: gen()] do
a ++ b ++ c
end

bench "append", [a: gen(), b: gen(), c: gen()] do
a |> append(b) |> append(c)
end

def append(front, back) when is_list(front) when is_list(back) do
front
|> Enum.reverse
|> Enum.reduce(back, &([&1 | &2]))
end

def gen, do: Enum.to_list(1..1000)
end

和输出:
benchma iterations   average time
++ 100000 10.22 µs/op
append 20000 75.79 µs/op

关于elixir - 在Elixir中串联多个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41821254/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com