找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: Lispboy

[研讨] 关于LISP表处理的测试练习,看看谁的代码高效的前提下更简洁

[复制链接]
发表于 2013-5-26 16:59:31 | 显示全部楼层
呵呵,这种方式很好,对初学者学习非常有益呀
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-26 17:16:11 | 显示全部楼层
本帖最后由 wowan1314 于 2013-5-26 20:01 编辑
  1. ;;WHILE方法
  2. (DEFUN T1 (LST / LST1)
  3.   (SETQ LST1 NIL)
  4.   (WHILE (SETQ LST1 (CONS (LIST (CAR LST) (CADR LST)) LST1)
  5.                LST (CDR LST)
  6.          )
  7.   )
  8.   (reverse (CDR LST1))
  9. )
  10. ;;foreach方法
  11. (DEFUN T2 (A / LST)
  12. (SETQ LST NIL)
  13. (foreach b a (setq lst (cons (list b (cadr a)) lst) a (cdr a)))
  14. (reverse (CDR LST))
  15. )
  16. ;;mapcar方法1
  17. (DEFUN T3 (LST)
  18. (mapcar '(lambda (a b) (list a b)) lst (cdr lst))
  19. );;mapcar方法2
  20. (DEFUN T4 (a)
  21. (apply 'mapcar (cons 'list (list a (cdr a))))
  22. )
  23. ;;mapcar方法3
  24. (DEFUN T5 (LST)
  25. (mapcar 'LIST lst (cdr lst))
  26. )
while、repeat、递归、foreach、mapcar 都可以实现。mapcar代码最简洁(估计也最高效)。

楼主来测效率吧。也算对此贴做个了结。
递归的话表长超过10000好像会出错.repeat方法速度肯定是慢点的。下面主要是对其他三种方法进行测试。  有事先走了。还是楼主来测吧。



论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-5-26 19:05:57 | 显示全部楼层
  1. (while (cdr lst)
  2.    (setq l (cons (list (car lst)(cadr lst)) l))
  3.    (setq lst (cdr lst))
  4. )
  5. (reverse l)

评分

参与人数 1D豆 +5 收起 理由
牢固 + 5 技术引导讨论和指点奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2013-5-26 19:32:30 | 显示全部楼层
都是高人啊
应当放到一个固定的循环里运行10万次,看谁的速度快,最短的代码效率不一定最好哦。
楼主帮着测试一下,大家才有比较。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-26 19:34:39 | 显示全部楼层
  1. (defun split (l)
  2.   (if (cdr l)
  3.     (cons (list (car l) (cadr l)) (split (cdr l)))
  4.   )
  5. )

评分

参与人数 1D豆 +5 收起 理由
牢固 + 5 技术引导讨论和指点奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

 楼主| 发表于 2013-5-26 20:12:14 | 显示全部楼层
wowan1314 发表于 2013-5-26 17:16
while、repeat、递归、foreach、mapcar 都可以实现。mapcar代码最简洁(估计也最高效)。

楼主来测效率 ...

好的,还有朋友贴代码吗?

大家先下个赌注吧,凭直觉赌下 哪层楼的代码 速度最快?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-5-26 20:25:03 | 显示全部楼层
Lispboy 发表于 2013-5-26 20:12
好的,还有朋友贴代码吗?

大家先下个赌注吧,凭直觉赌下 哪层楼的代码 速度最快?

要测试了? 我宣布,我再加个代码,我的2个都要求测。:$ 少了reverse 换成append,一直想弄清哪个更快,以前懒,没做过,楼主代劳了。

  1. (while (cdr lst)
  2.    (setq l (append l (list (list (car lst)(cadr lst)))))
  3.    (setq lst (cdr lst))
  4. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-5-26 20:27:10 | 显示全部楼层
我凭直觉当然是我的快{:soso_e113:}, 18楼和22楼, 我赌 18 楼的快。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-26 20:52:34 | 显示全部楼层
本帖最后由 GTJ116600 于 2013-5-26 21:25 编辑

初学者,凑个热闹,也来一个。
  1. (defun tt(lst / i newlst )
  2.           (setq i 0 newlst nil)
  3.           (while (> (- (length lst) 1) i)
  4.                    (setq newlst (cons (list (nth i lst)(nth (1+ i) lst))  newlst))
  5.                    (setq i (1+ i))
  6.           )
  7.          (setq newlst (reverse newlst))      
  8. )



评分

参与人数 1D豆 +3 收起 理由
牢固 + 3 及时回复奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-26 20:57:59 | 显示全部楼层
newer 发表于 2013-5-26 20:27
我凭直觉当然是我的快, 18楼和22楼, 我赌 18 楼的快。

肯定11楼Underway的效率最高!代码最简短,而且用的都是最基本的函数!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-26 21:05:25 | 显示全部楼层
newer 发表于 2013-5-26 20:25
要测试了? 我宣布,我再加个代码,我的2个都要求测。 少了reverse 换成append,一直想弄清哪个更快, ...

append函数肯定要慢,而且慢多了,表越长越显得慢!在这个贴子里    勿在浮沙筑高台--由LISP公理推导函数的几个练习  G版在4楼讨论过的!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-26 21:15:02 | 显示全部楼层
处处问题鸟 发表于 2013-5-26 19:05
append函数肯定要慢,而且慢多了,表越长越显得慢!在这个贴子里    勿在浮沙筑高台--由LISP公理推导函数 ...

append函数肯定要慢,一直在cdr大表的感觉也不快,所以mapcar那个极简但不一定快。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-26 21:24:51 | 显示全部楼层
cy956 发表于 2013-5-26 21:15
append函数肯定要慢,一直在cdr大表的感觉也不快,所以mapcar那个极简但不一定快。

我测试了一下部分代码,结果如下:
命令: tt
  4楼炫翔用时  21.716  秒
  7#楼Lisphk用时  90.153  秒
  9#楼wowan1314用时  21.59  秒
  11#楼Underway用时  2.761  秒
  14#楼wowan1314用时  19.188  秒
  18#楼newer用时  17.816  秒
  20#楼楼夜来风语声用时  18.049  秒
命令:

结果显示11楼的代码最快!
测试代码如下:
  1. (defun c:tt ()
  2.    
  3.   (repeat (setq i 1000)
  4.     (setq l (cons (setq i (1- i)) l))
  5.     )
  6.   ;;4楼炫翔
  7.   (defun t11 (lst / lst1)
  8.     (setq lst1 nil)
  9.     (while (and (car lst) (cadr lst))
  10.       (setq lst1 (cons (list (car lst) (cadr lst)) lst1)
  11.       lst   (cdr lst)
  12.       )
  13.     )
  14.     (reverse lst1)
  15.   )
  16. (setq *StartTime* (car (_VL-TIMES)))
  17.   (repeat 10000
  18.     (t11 l)
  19.     )
  20.   (princ (strcat "\n  4楼炫翔用时  " (rtos (* 0.001 (- (car (_VL-TIMES)) *StartTime*)) 2 4) "  秒 "))
  21.   ;;7#楼Lisphk
  22.   (defun t2 (a / l)
  23.     (setq i 0
  24.     l nil
  25.     )
  26.     (repeat (- (length a) 1)
  27.       (setq b (nth i a)
  28.       i (1+ i)
  29.       c (nth i a)
  30.       l (cons (list b c) l)
  31.       )
  32.     )
  33.     (reverse l)
  34.   )
  35. (setq *StartTime* (car (_VL-TIMES)))
  36.   (repeat 10000
  37.     (t2 l)
  38.     )
  39.   (princ (strcat "\n  7#楼Lisphk用时  " (rtos (* 0.001 (- (car (_VL-TIMES)) *StartTime*)) 2 4) "  秒 "))
  40. ;;9#楼wowan1314
  41.   (DEFUN T12 (LST / LST1 T11)
  42.     (DEFUN T11 (LST)
  43.       (AND (cadr lst)
  44.      (setq lst1 (cons (list (car lst) (cadr lst)) lst1)
  45.      lst  (cdr lst)
  46.      )
  47.      (T11 LST)
  48.       )
  49.     )
  50.     (SETQ LST1 NIL)
  51.     (T11 LST)
  52.     (reverse lst1)
  53.   )
  54. (setq *StartTime* (car (_VL-TIMES)))
  55.   (repeat 10000
  56.     (t12 l)
  57.     )
  58.   (princ (strcat "\n  9#楼wowan1314用时  " (rtos (* 0.001 (- (car (_VL-TIMES)) *StartTime*)) 2 4) "  秒 "))
  59. ;;11#楼Underway
  60.   (defun t13 (a)
  61.     (apply 'mapcar (cons 'list (list a (cdr a))))
  62.     )
  63.   (setq *StartTime* (car (_VL-TIMES)))
  64.   (repeat 10000
  65.     (t13 l)
  66.     )
  67.   (princ (strcat "\n  11#楼Underway用时  " (rtos (* 0.001 (- (car (_VL-TIMES)) *StartTime*)) 2 4) "  秒 "))

  68.   ;;14#楼wowan1314
  69.   (DEFUN T14 (A / LST)
  70.     (SETQ LST NIL)
  71.     (foreach b a
  72.       (setq lst  (cons (list b (cadr a)) lst)
  73.       a  (cdr a)
  74.       )
  75.     )
  76.     (reverse (CDR LST))
  77.   )
  78.    (setq *StartTime* (car (_VL-TIMES)))
  79.   (repeat 10000
  80.     (t14 l)
  81.     )
  82.   (princ (strcat "\n  14#楼wowan1314用时  " (rtos (* 0.001 (- (car (_VL-TIMES)) *StartTime*)) 2 4) "  秒 "))
  83. ;;18#楼 newer
  84.   (defun t15 (lst / l)
  85.   (while (cdr lst)   (setq l (cons (list (car lst)(cadr lst)) l))   (setq lst (cdr lst)))(reverse l)
  86.     )
  87.      (setq *StartTime* (car (_VL-TIMES)))
  88.   (repeat 10000
  89.     (t15 l)
  90.     )
  91.   (princ (strcat "\n  18#楼newer用时  " (rtos (* 0.001 (- (car (_VL-TIMES)) *StartTime*)) 2 4) "  秒 "))
  92. ;;20#楼夜来风语声
  93.   (defun split (l)  (if (cdr l)    (cons (list (car l) (cadr l)) (split (cdr l)))  ))
  94.      (setq *StartTime* (car (_VL-TIMES)))
  95.   (repeat 10000
  96.     (split l)
  97.     )
  98.   (princ (strcat "\n  20#楼楼夜来风语声用时  " (rtos (* 0.001 (- (car (_VL-TIMES)) *StartTime*)) 2 4) "  秒 "))
  99.   (princ)
  100.   )

评分

参与人数 1D豆 +5 贡献 +1 收起 理由
牢固 + 5 + 1 技术引导讨论和指点奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-26 21:26:48 | 显示全部楼层
试试这样:
(setq b2(cdr b1)
        b(mapcar 'list b1 b2))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-26 21:29:45 | 显示全部楼层
Lisper 发表于 2013-5-26 19:24
我测试了一下部分代码,结果如下:
命令: tt
  4楼炫翔用时  21.716  秒

试试这样:
(setq b2(cdr b1)
        b(mapcar 'list b1 b2))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-5-1 09:31 , Processed in 0.548658 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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