在Erlang中以等大小的块分割列表 [英] Splitting a list in equal sized chunks in Erlang

查看:100
本文介绍了在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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆