中国CAD论坛

 找回密码
 注册会员

QQ登录

只需一步,快速开始

凯得学院(CAD8学院)AutoCAD软件下载AutoCAD视频教程等待验证会员请验证邮箱
注册会员指导可以赚钱的网盘CAD习题集AutoCAD技巧
查看: 11|回复: 0
收起左侧

cons为什么比append处理更高效

[复制链接]
发表于 2018-11-8 09:09:57 | 显示全部楼层 |阅读模式 简体中文繁體中文
用QQ等截图工具截图后,点中发贴区直接按Ctrl+V键就可以将截图粘贴到发贴框.

欢迎加入,注册成为会员,享用更多功能,完全免费。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
cons和append这两个函数都是对list进行添加数据处理,不过他们处理的方法不一样;
cons是对list的数据头部进行元素添加;
append 他对list的数据尾部和头部都可以添加;

举个例子:

  1. (setq lst (list 1 2 3 4 5))
  2. (cons 6 lst) ;;;;输出结果为: (6 1 2 3 4 5 )
  3. (append lst (list 6)) ;;;;输出结果为: (1 2 3 4 5 6 )
  4. (append (list 6) lst ) ;;;;输出结果为: (6 1 2 3 4 5 )
  5. 下面我们测试一下各自的速度:

  6. (defun ggc (/ s);;;计时函数
  7. (setq s (getvar "DATE"))
  8. (setq seconds (* 86400.0 (- s (fix s))))
  9. )

  10. (defun ts1 ()
  11. (setq ts (ggc)
  12. i 0
  13. lst (list)
  14. )
  15. (repeat 3000
  16. (setq lst (cons i lst))
  17. (setq i (1+ i))
  18. )
  19. (princ (strcat "\n cons计时: " (rtos (- (ggc) ts) 2 8)))
  20. (princ)
  21. )

  22. (defun ts2 ()
  23. (setq ts (ggc)
  24. i 0
  25. lst (list)
  26. )
  27. (repeat 3000
  28. (setq lst (append (list i) lst))
  29. (setq i (1+ i))
  30. )
  31. (princ (strcat "\n append头部计时: " (rtos (- (ggc) ts) 2 8)))
  32. (princ)
  33. )

  34. (defun ts3 ()
  35. (setq ts (ggc)
  36. i 0
  37. lst (list)
  38. )
  39. (repeat 3000
  40. (setq lst (append (list i) lst))
  41. (setq i (1+ i))
  42. )
  43. (princ (strcat "\n append尾部计时: " (rtos (- (ggc) ts) 2 8)))
  44. (princ)
  45. )

  46. (defun c:test1 ()
  47. (repeat 10
  48. (princ "\n******************************")
  49. (ts1)
  50. (ts2)
  51. (ts3)
  52. )
  53. )


31c4000230d644bdb9e4

由输出结果可知:cons的速度比append的效率相差差不多100倍;为什么效率相差这么多呢;

这就要从list的读写机制进行分析了:

list读取的读写的数据是:先进后出

如果懂一点数据结构的同学,就听说过数据里面的堆栈:

堆栈分别对应两种结构:

堆,队列优先,先进先出(FIFO—first in first out) ;

栈,先进后出(FILO—First-In/Last-Out);

结构图如下:

2ede0002fbf212d19504

这怎么理解呢:

先进先出就好像看病一样:那个先来,哪个就先就诊;

后进先出就如同箱子里放东西。哪个先放。哪个就在最里面。最后放的就在最外面,如果要拿最里面的东西,就把外面的东西都拿出来才可以拿到最里面的东西。

那么现在就可以很好的理解cons和append;

cons就等于后来先出,每次有元素增加,就直接放在箱子里的最外面;

append就等于先进先出,每次有元素增加,先把箱子里的东西全部拿出来,在看看东西是在最里面还是最外面,再把他放到箱子里;

这就解释了为什么cons的效率比append的效率高那么多了。




上一篇:AutoCAD 用cc检查公差标注H05x用Lisp源程序
下一篇:AutoCAD下,实测巷道控制点展点用的Lisp源程序

帖子地址: 

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

本版积分规则

本站所有资料仅供大家学习之用,商用请务必购买正版版权!有侵权之处,请联系管理员(QQ:119891935)删除!
快速回复 返回顶部 返回列表