gpt4 book ai didi

erlang -++ 运算符是否比 | 更昂贵? Erlang中的运算符?

转载 作者:行者123 更新时间:2023-12-04 23:19:50 26 4
gpt4 key购买 nike

我在看 Learn You Some Erlang我在 Recursion 中发现了这个例子章节。

tail_sublist(_, 0, SubList) -> SubList;
tail_sublist([], _, SubList) -> SubList;
tail_sublist([H|T], N, SubList) when N > 0 ->
tail_sublist(T, N-1, [H|SubList]).

正如作者继续解释的那样,我们的代码中有一个致命的缺陷。因此产生的子列表将是反向的,我们将不得不重新反向它们以获得正确的输出。相比之下,我所做的是使用 ++运算符以避免稍后反转列表。
sublist_tail([],_,Acc) -> Acc;
sublist_tail(_,0,Acc) -> Acc;
sublist_tail([H|T],N,Acc) -> sublist_tail(T,N-1,Acc++[H]).

我的问题是, ++运营商比|贵运算符(operator)? 如果是, 与作者的解决方案(包括反转列表以获得正确的输出)相比,我的解决方案(使用 ++ 运算符)是否仍然很慢?

最佳答案

您可能希望在 Erlang efficiency guide 中阅读有关此问题的信息。 ,因为那里说通过 | 建立列表然后反转结果比使用附加 ++ 更有效运算符(operator)。如果您想知道性能差异,请使用 timer:tc :

1> timer:tc(fun() -> lists:reverse(lists:foldl(fun(V, Acc) -> [V|Acc] end, [], lists:seq(1,1000))) end).
{1627,
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,
23,24,25,26,27|...]}
2> timer:tc(fun() -> lists:foldl(fun(V, Acc) -> Acc++[V] end, [], lists:seq(1,1000)) end).
{6216,
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,
23,24,25,26,27|...]}

两种方法都创建了 1000 个整数的列表,但这些基于 Erlang/OTP 17.5 的测量表明,前置/反转版本比附加版本快 4 倍(当然是 YMMV)。

关于erlang -++ 运算符是否比 | 更昂贵? Erlang中的运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30529559/

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