我有一份清单
[1, 4, 3]
Run Code Online (Sandbox Code Playgroud)
我想繁殖它,比如:
[1, 4, 3] * 3 # => [1, 4, 3, 1, 4, 3, 1, 4, 3]
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
我相信,Elixir惯用解决方案将是使用 List.duplicate/2
list |> List.duplicate(3) |> List.flatten
Run Code Online (Sandbox Code Playgroud)
请注意,如果list预计会有嵌套列表,并且它们不会被展平,则应使用:
list |> List.duplicate(3) |> :lists.concat
Run Code Online (Sandbox Code Playgroud)
- 积分去@Dogbert
我Enum.map用:lists.concat(Enum.concat比慢得多:lists.concat):
:lists.concat(Enum.map(1..100, fn(_) -> @list end))
Run Code Online (Sandbox Code Playgroud)
以下是此主题中的建议和我的其他一些尝试的一些基准:
defmodule BasicBench do
use Benchfella
@list Enum.to_list(1..100)
bench "1 by @asiniy" do
Enum.reduce(1..100, [], fn(_, acc) -> acc ++ @list end)
end
bench "2 by @radubogdan" do
Enum.take(Stream.cycle(@list), 10000)
end
bench "3 by @Dogbert" do
Enum.flat_map(1..100, fn(_) -> @list end)
end
bench "4 by @Dogbert" do
Enum.concat(Enum.map(1..100, fn(_) -> @list end))
end
bench "5 by @Dogbert" do
:lists.concat(Enum.map(1..100, fn(_) -> @list end))
end
bench "6 by @mudasobwa" do
@list |> List.duplicate(100) |> List.flatten
end
bench "7 by @mudasobwa + @Dogbert" do
:lists.concat(List.duplicate(@list, 100))
end
end
Run Code Online (Sandbox Code Playgroud)
输出:
benchmark name iterations average time
7 by @mudasobwa + @Dogbert 50000 35.72 µs/op
5 by @Dogbert 50000 38.92 µs/op
6 by @mudasobwa 10000 124.30 µs/op
3 by @Dogbert 10000 174.63 µs/op
4 by @Dogbert 10000 242.24 µs/op
2 by @radubogdan 2000 924.04 µs/op
1 by @asiniy 1000 2143.24 µs/op
Run Code Online (Sandbox Code Playgroud)