找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 929|回复: 19

[研讨] 【效率测试】返回表奇数位元素组成子表的几个代码的效率比较

[复制链接]

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-12-11 15:57:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 newer 于 2017-12-11 18:53 编辑



1、2和3的算法相同,只是一个构建表,一个用vl-remove 删除偶数位的NIL,但效率差别很大。
2、最快的是1,递归算法,表元素30000一下,秒其他两个,但缺点就是受到堆栈的限制,在元素确定不是很多(万以上)时候,值得用。

你还能写出其他算法的代码吗? 欢迎贴上来一起测试。

  1. (defun _2nd1 (lst)
  2.   (if lst
  3.     (cons (car lst) (2nd1 (cddr lst)))
  4.   )
  5. )
  6. (defun _2nd2 (lst / lst1 i)
  7.   (setq i 0)
  8.   (mapcar '(lambda (x)
  9.              (if (= (rem (setq i (1+ i)) 2) 1)
  10.                (setq lst1 (cons x lst1))
  11.              )
  12.            )
  13.           lst
  14.   )
  15.   (reverse lst1)
  16. )
  17. (defun _2nd3 (lst / i)
  18.   (setq i 0)
  19.   (vl-remove nil
  20.              (mapcar '(lambda (x)
  21.                         (if (= (rem (setq i (1+ i)) 2) 1)
  22.                           x
  23.                         )
  24.                       )
  25.                      lst
  26.              )
  27.   )
  28. )
  29. (defun c:tt (/ i)
  30.   (setq i 0 lst nil)
  31.   (repeat 30000 (setq lst (cons (setq i (1+ i)) lst)))
  32.   (xd::quickbench '((_2nd1 lst) (_2nd2 lst) (_2nd3 lst)))
  33.   (princ)
  34. )



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

已领礼包: 1857个

财富等级: 堆金积玉

发表于 2017-12-12 10:24:35 | 显示全部楼层
本帖最后由 aimisiyou 于 2017-12-12 12:21 编辑

(defun _2nd4  (lst)
   (setq i 1 flst nil)
   (foreach a lst
      (progn   
          (if (= i 1)
              (setq flst (cons a flst))  
          )
         (setq i (~ i))
        )
     )
    (reverse flst)
)

评分

参与人数 1D豆 +5 贡献 +1 收起 理由
newer + 5 + 1 有始有终奖!

查看全部评分

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

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2017-12-12 12:02:15 | 显示全部楼层
本帖最后由 /db_自贡黄明儒_ 于 2017-12-12 12:05 编辑

  1. ;;(_2nd5 '(1 2 3 4 5)) => (1 3 5)
  2. (defun _2nd5 (lst / A FLAG L)
  3.   (setq Flag T)
  4.   (while (setq a (car lst))
  5.     (setq lst (cdr lst))
  6.     (if        Flag
  7.       (setq L (cons a L))
  8.     )
  9.     (setq Flag (not Flag))
  10.   )
  11.   (reverse L)
  12. )
本程序不计算i 和rem 应该可以省点时间吧

评分

参与人数 1D豆 +5 贡献 +1 收起 理由
newer + 5 + 1 有始有终奖!

查看全部评分

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2017-12-12 12:07:54 | 显示全部楼层

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

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2017-12-12 14:09:00 | 显示全部楼层
  1. ;;(_2nd6 '(1 2 3 4 5)) => (1 3 5)
  2. (defun _2nd6 (lst / A FLAG L)
  3.   (while (setq a   (car lst)
  4.                lst (cddr lst)
  5.          )
  6.     (setq L (cons a L))
  7.   )
  8.   (if a (setq L (cons a L)))
  9.   (reverse L)
  10. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2017-12-12 14:18:50 | 显示全部楼层

这个牛
在写个 求 偶数位的吧。


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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2017-12-12 15:52:40 | 显示全部楼层
递归应该慢才对
奇数位:
(defun _1st (lst / i)
  (setq i 0)
  (vl-remove-if-not
     '(lambda (x) (= (rem (setq i (1+ i)) 2) 1) )
      lst
  )
)

评分

参与人数 1D豆 +5 贡献 +1 收起 理由
newer + 5 + 1 有始有终奖!

查看全部评分

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2017-12-12 15:56:21 | 显示全部楼层
本帖最后由 aeo 于 2017-12-12 15:57 编辑

一般的规律,和lisp交互的次数越少(数据交换的次数),速度越快。
只要代码的方法是一个数量级的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

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

使用道具 举报

已领礼包: 1857个

财富等级: 堆金积玉

发表于 2017-12-12 17:14:02 | 显示全部楼层
本帖最后由 aimisiyou 于 2017-12-12 17:20 编辑



;;;采用二分法,效率是最慢的。
(defun _2nd7 (lst)
  (defun f1 (lst1 k)
    (if (= k 0)
         lst1
         (reverse (cdr (reverse (f1 lst1 (- k 1)))))
    )
)
  (if (cddr lst)
      (append
              (_2nd7  (f1 lst  (+ (/ (- (length lst) 1) 2) (/ (- 3 (rem (length lst) 4)) 2))   ))
              (_2nd7  (reverse (f1 (reverse lst) (+ (/ (length lst) 2) (/ (rem (length lst) 4) 2))  )))
         )     
      (list (car lst))
   )
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2017-12-12 17:23:04 | 显示全部楼层

哪地方有问题? 别的是你这个的好几百倍。

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

使用道具 举报

已领礼包: 1857个

财富等级: 堆金积玉

发表于 2017-12-12 17:26:42 | 显示全部楼层

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

使用道具 举报

已领礼包: 5060个

财富等级: 富甲天下

发表于 2017-12-12 18:24:54 来自手机 | 显示全部楼层
aeo的很快,用arx也未必比他快
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1742个

财富等级: 堆金积玉

发表于 2017-12-14 08:40:21 | 显示全部楼层
贴一个我目前在用的
  1. (defun xx-list-odd (#lst / el)
  2.         (setq el nil)
  3.   (while #lst
  4.     (setq
  5.                         el (cons (car #lst) el)
  6.                         #lst (cddr #lst)
  7.     )
  8.   )
  9.   (reverse el)
  10. )

评分

参与人数 1D豆 +5 贡献 +1 收起 理由
newer + 5 + 1 有始有终奖!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 16:50 , Processed in 0.498612 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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