在Erlang中以等大小的块分割列表 [英] Splitting a list in equal sized chunks in Erlang
本文介绍了在Erlang中以等大小的块分割列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想拆分:
[1,2,3,4,5,6,7,8]
into:
[[1,2],[3,4],[5,6],[7,8]]
它通常适用于:
[ lists:sublist(List, X, 2) || X <- lists:seq(1,length(List),2) ] .
但是这样做真的很慢。 10000元素在我的上网本上惊人的2.5秒。我也写了一个非常快的递归函数,但我只是感兴趣:这个列表的理解也可以用不同的方式写出来,以便它更快?
But it is really slow this way. 10000 Elements take amazing 2.5 seconds on my netbook. I have also written a really fast recursive function, but I am simply interested: Could this list comprehension also be written in a different way, so that it is faster?
推荐答案
尝试这样:
part(List) ->
part(List, []).
part([], Acc) ->
lists:reverse(Acc);
part([H], Acc) ->
lists:reverse([[H]|Acc]);
part([H1,H2|T], Acc) ->
part(T, [[H1,H2]|Acc]).
在erlang-shell中测试(我已经在模块部分声明了这个功能
):
Test in erlang-shell (I've declared this function in module part
):
2> part:part([1,2,3,4,5,6,7,8]).
[[1,2],[3,4],[5,6],[7,8]]
3>
3> timer:tc(part, part, [lists:seq(1,10000)]).
{774,
[[1,2],
[3,4],
[5,6],
[7,8],
"\t\n","\v\f",
[13,14],
[15,16],
[17,18],
[19,20],
[21,22],
[23,24],
[25,26],
[27,28],
[29,30],
[31,32],
"!\"","#$","%&","'(",")*","+,","-.","/0","12","34",
[...]|...]}
只有774微秒(约0,8毫秒)
这篇关于在Erlang中以等大小的块分割列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文