明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: guosheyang

[函数] 一个速度很快又简洁的列表分段函数

[复制链接]
发表于 2022-10-7 16:33 来自手机 | 显示全部楼层
改用mapcar还可以提高10~20%速度,以前全测过mapacar比repeat,foreach,while都快
发表于 2022-10-7 16:42 | 显示全部楼层
tigcat 发表于 2022-9-30 21:51
3#楼返回值应该((1) (2 3 4) (5 6 7) (8 9 10) (11 12 13))是这样子。

为什么不能是((1 2 3) (4 5 6) (7 8 9) (10 11 12) (13))?
发表于 2022-10-7 17:43 | 显示全部楼层
cchessbd 发表于 2022-10-7 16:13
恩,不错,这个才是正确的。顶楼函数有问题,不要下。

楼主函数在表元素个数L,划分维数n,L=k*n,k-整数,时效率很高。
发表于 2022-10-7 17:47 | 显示全部楼层
llsheng_73 发表于 2022-10-7 16:42
为什么不能是((1 2 3) (4 5 6) (7 8 9) (10 11 12) (13))?

我是运行后得到的结果。程序有个转置函数,从最后的元素开始满足。可以将cons换成list 与car组合。就不会出现这个问题了。
发表于 2022-10-7 18:03 | 显示全部楼层
本帖最后由 llsheng_73 于 2022-10-7 18:30 编辑
tigcat 发表于 2022-10-7 17:47
我是运行后得到的结果。程序有个转置函数,从最后的元素开始满足。可以将cons换成list 与car组合。就不会 ...

我一直以来用的是while+repeat的,测试了下,速度确实比先reverse再foreach慢很多,综合了一下几个楼层的代码,得到代码如下,经测试,结果是正确的,速度还行吧,反正我要把我以前的换成下边这个了
  1. (defun divlst(lst n / l l2)
  2.   (if(< 0 n(length lst))
  3.     (progn
  4.       (repeat(rem(length(setq lst(reverse lst)))n)
  5.         (setq l(cons(car lst)l)lst(cdr lst)))
  6.       (and l(setq l2(cons l l2)l nil))
  7.       (foreach x lst
  8.         (if(=(length(setq l(cons x l)))n)
  9.           (setq l2(cons l l2)l nil)))
  10.       l2)
  11.     (list lst)))

从表头开始,多余的尾巴保持在最后
(DIVLST '(1 2 3 4 5 6 7 8 9 10 11 12 13) 3)=>((1 2 3) (4 5 6) (7 8 9) (10 11 12) (13))
(DIVLST '(1 2 3 4 5 6 7 8 9 10 11 12) 3)=>((1 2 3) (4 5 6) (7 8 9) (10 11 12))
例外情况处理
(DIVLST '(1 2 3 4 5 6 7 8 9 10 11 12 13) 50)=>((1 2 3 4 5 6 7 8 9 10 11 12 13))
(DIVLST '(1 2 3 4 5 6 7 8 9 10 11 12 13) -1)=>((1 2 3 4 5 6 7 8 9 10 11 12 13))


发表于 2022-10-7 18:19 | 显示全部楼层
尘缘一生 发表于 2022-9-30 21:35
不完善,不足分组的会舍弃,应该这样

(XL-DIV '(1 2 3 4 5 6 7 8 9 10 11 12 13) 13)=>(nil (1 2 3 4 5 6 7 8 9 10 11 12 13))
发表于 2022-10-7 19:21 | 显示全部楼层
llsheng_73 发表于 2022-10-7 18:03
我一直以来用的是while+repeat的,测试了下,速度确实比先reverse再foreach慢很多,综合了一下几个楼层的 ...

是挺好使,这个reverse多了影响速度
发表于 2022-10-7 20:00 | 显示全部楼层
记得有人对fas研究,repeat foreach 都是用while写成的,楼上说while+repeat,速度比foreach慢很多,没道理
发表于 2022-10-7 20:25 | 显示全部楼层
aeo000000 发表于 2022-10-7 20:00
记得有人对fas研究,repeat foreach 都是用while写成的,楼上说while+repeat,速度比foreach慢很多,没道 ...

这个问题用while+repeat处理,少不了在while里边reverse,多次reverse把速度拖慢了
 楼主| 发表于 2022-10-8 08:24 | 显示全部楼层
本帖最后由 guosheyang 于 2022-10-8 08:55 编辑
wzg356 发表于 2022-10-7 16:33
改用mapcar还可以提高10~20%速度,以前全测过mapacar比repeat,foreach,while都快

针对本实例  经测试  少量数据时  foreach快些  但是如果将列表的数据长度加大比如10万个   再repeat100次   则是mapcar形式的运行稍微快点  这只是针对纯数字的  针对文本  点坐标数据  可能又不一样  需要多测试     但是套上mapcar    需要加上lambda临时函数 多了这些环节 总觉得没有foreach那么简洁  这是代码

(defun @group2(lst n / ITEM N NEW X)
(mapcar'(lambda(x)
            (setq item(cons x item))  
            (if(= (length item) n)
               (setq new (cons item new) item nil)
            )
         )
  (reverse lst)
)
new
)

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-2 05:05 , Processed in 2.173263 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表