Ea 发表于 2011-11-11 12:31:46

本帖最后由 Ea 于 2011-11-11 12:33 编辑

(defun getutime      ()
(* 86400 (getvar "tdusrtimer"))
)
(defun numb (n / m l)
(setq m 0)
(repeat n
    (setq l (cons m l)
          m (1+ m)
    )
)
l
)
(defun cut (n lst / l)
(repeat (1- n)
    (setq l (cons(car lst) l ))
)
(append (reverse l) (cdr lst))
)
(defun c:tt (/ t1 l)
(setq t1 (getutime))
(setq l (numb 15000))
(princ "\nTimes = ")
(princ (- (getutime) t1))
(setq t1 (getutime))
(cut 9999 l)
(princ "\nTimes = ")
(princ (- (getutime) t1))
(princ)
)运行速度和机器配置、是否打开 vlisp 编辑器,CAD运行情况等等都有关系

小菜123 发表于 2011-11-11 13:06:06

牛人都冒出来,最后应当有个结论,表明哪些lisp函数组成的算法速度占优

yjr111 发表于 2011-11-11 13:15:28

红花还需绿叶衬,重在参与哈

Gu_xl 发表于 2011-11-11 14:35:05

本帖最后由 Gu_xl 于 2011-11-11 14:43 编辑

对我的方法3代码再进行优化一下,又快了不少!目前测试是最快的!

;;;方法四
(defun gxl-removeNth3(index lst /rtn len)
(if (< -1 index (setq len (length lst)))
    (if (<= index (/ len 2)) ;_ index位于前半截
      (progn
(repeat index
   (setq rtn (cons (car lst) rtn)
lst (cdr lst)
)
   )
(append (reverse rtn) (cdr lst))
)
      (progn ;_ index位于后半截
(setq index (- len index 1)
       lst   (reverse lst)
       )
(repeat index
   (setq rtn (cons (car lst) rtn)
lst (cdr lst)
)
   )
(reverse (append (reverse rtn) (cdr lst)))
)
      )
      lst ;_ index 越界
    )
)

全部测试代码:

测试结果:
命令: tt
Gu_xl 方法一:
用时0.53125秒
Gu_xl 方法二:
用时0.441406秒
Gu_xl 方法三:
用时0.09375秒
Gu_xl 方法四repeat:
用时0.078125秒
duotu007 方法:
用时0.265625秒
xshrimp 方法:
用时0.171875秒
fsxm 方法:
用时0.09375秒
yjr111 test3方法:
用时0.296875秒
xianaihua递归方法:
用时0.21875秒
xianaihua迭代方法:
用时0.234375秒

提高运算速度的方法小结:
1、尽量减少程序运算次数
2、尽量直接使用lisp基本函数,如:car、cdr、cons等,近量少用append、length等函数
3、使用递归等方法,速度相对较慢!比直接使用基本函数计算逊色不少!

fsxm 发表于 2011-11-11 14:36:20

xianaihua 发的那个递归方法很nb,
如果再分下首尾,完美!

cnks 发表于 2011-11-11 15:06:08

Gu_xl 发表于 2011-11-11 14:35 static/image/common/back.gif
对我的方法3代码再进行优化一下,又快了不少!目前测试是最快的!

全部测试代码:


多用car和cdr是正确的,避免使用cons
这是因为编译的原因,car和cdr之类的都是内部函数,而cons是arx定义的函数,这当然比内部函数运行效率低

cnks 发表于 2011-11-11 15:21:28

不好意思,g版,你的没错,查了查cons也是内部函数

xianaihua 发表于 2011-11-11 15:39:21

;;;递归法+
(defun RemoveNth3 (n l)
(defun
      RemoveNth
         (index lst)
    (if(and lst (< 0 index))
      (cons (car lst) (RemoveNth (1- index) (cdr lst)))
      (cdr lst)
    ) ;_ 结束if
) ;_ 结束defun
(if (> n
   (/ (setq len (length l)) 2)
      ) ;_ 结束>
    (reverse (RemoveNth (- len n 1) (reverse l)))
    (RemoveNth n l)
) ;_ 结束defun
) ;_ 结束defun递归改进版,用Gl的测速方法:
Gu_xl 方法一:
用时1.64063秒
Gu_xl 方法二:
用时2.03125秒
Gu_xl 方法三:
用时0.277344秒
Gu_xl 方法四repeat:
用时0.300781秒
duotu007 方法:
用时1.28125秒
xshrimp 方法:
用时0.34375秒
fsxm 方法:
用时0.261719秒
yjr111 test3方法:
用时1.10938秒
xianaihua递归方法:
用时0.191406秒

xianaihua 发表于 2011-11-11 16:07:27

Benchmark显然是有问题的,单个测和几个程序在一起测,差别很大

Gu_xl 发表于 2011-11-11 16:20:49

测速的方法对各种算法的速度是有影响的!比如表的长度不同、删除项的位置不同,各种算法的速度都有影响,测试的结果谁快谁慢也不尽相同!你们可修改24楼测试代码的参数测试下!编译以后再运行结果比较准确!
页: 1 2 [3] 4 5 6 7
查看完整版本: [讨论]->征求最佳答案:删除表中第 n 个元素的最快算法