找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: pengfei2010

[研讨] mapcar效率与lambda函数有关

[复制链接]

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-6-3 21:36:39 | 显示全部楼层
pengfei2010 发表于 2013-6-3 21:18
再次传上测试文件

http://bbs.xdcad.net/thread-668610-1-1.html

这个帖子里面有 wowan1314 的测试函数,里面有时间计时的, 你多建立些多边形,对MAPCAR来说,40个太小了。

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-6-3 21:43:45 | 显示全部楼层
本帖最后由 newer 于 2013-6-3 21:46 编辑
pengfei2010 发表于 2013-6-3 20:58
我思考过,跟append没有关系,以为append只运行了一次,主要是把所有图元的组码放到一个大表里面,方便下 ...

对于刚才说的

(setq zmlst (apply 'append (mapcar '(lambda(x) (entget x)) ents)))(length zmlst)

这句,你看是一个APPEND,可是参数是很多表,对大量的表,每个元素都遍历,速度很慢的。
哪怕即使你想用APPEND,也应该在把entget没用的数据剔除后,留下顶点的时候,再APPEND,省去很多没用的数据浪费的时间。

点评

不能先过滤,那样就不公平!因为上面的代码都没有过滤哦!还有 我单独测试这一句代码,基本是不耗时的  详情 回复 发表于 2013-6-3 23:14
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-3 21:51:15 | 显示全部楼层
本帖最后由 QiaoCheng 于 2013-6-3 21:55 编辑

俺试了下这么个情况
111 用时  0.4850  秒
222 用时  0.7660  秒
333 用时  1.1250  秒
444 用时  0.4060  秒

不知道还有谁测试是不同的?

{:soso_e113:}还好最近在研究apply没白浪费时间

点评

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

使用道具 举报

已领礼包: 3739个

财富等级: 富可敌国

发表于 2013-6-3 22:03:02 | 显示全部楼层
444改为如下555一试:

  1. (defun c:555 (); ents lst ss x zmlst)   ; test_mapcar
  2.   (setq ss (ssget '((0 . "LWPOLYLINE")))
  3.         lst nil
  4.         zmlst nil
  5.   )
  6.   (setq ents (cpf-ss->ents ss))
  7.   (mapcar
  8.     '(lambda (x)
  9.        (mapcar
  10.          '(lambda (y)
  11.             (setq lst (cons y lst))
  12.           )
  13.          (mapcar
  14.            'cdr
  15.            (vl-remove-if-not '(lambda (y)
  16.                                 (= (car y) 10)
  17.                               ) (entget x)
  18.            )
  19.          )
  20.        )
  21.      )
  22.     ents
  23.   )
  24.   (length lst)
  25. )

点评

这个代码把14楼NEWER的代码几个MAPCAR合并到一起了。两个的效率应该是一样的。一个代码短,一个更容易读懂。各有千秋。  详情 回复 发表于 2013-6-3 22:09

评分

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

查看全部评分

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-6-3 22:04:31 | 显示全部楼层
QiaoCheng 发表于 2013-6-3 21:51
俺试了下这么个情况
111 用时  0.4850  秒
222 用时  0.7660  秒

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-6-3 22:09:52 | 显示全部楼层
dnbcgrass 发表于 2013-6-3 22:03
444改为如下555一试:

这个代码把14楼NEWER的代码几个MAPCAR合并到一起了。两个的效率应该是一样的。一个代码短,一个更容易读懂。各有千秋。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-3 22:10:26 | 显示全部楼层
本帖最后由 QiaoCheng 于 2013-6-3 22:19 编辑

=====================================
对象40个的情况下
111 用时  0.4850  秒 (while)
222 用时  0.7660  秒 (repeat)
333 用时  1.1250  秒 (foreach)
444 用时  0.4060  秒 (mapcar)
=====================================
对象80个的情况下
用时  0.8590  秒  (while)
用时  1.3130  秒  (repeat)
用时  3.1400  秒  (foreach)
用时  0.7350  秒  (mapcar)
=====================================
对象640个的情况下  
用时  7.3750  秒   (while)
用时  11.2970 秒   (repeat)
机子崩溃了{:soso_e109:}         (foreach)   用时  171.4530
用时  7.6560  秒   (mapcar)

楼主您的四种代码是不是每种都保证是最大优化的?

前三个用楼主的,第四个用newer的

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

使用道具 举报

已领礼包: 3739个

财富等级: 富可敌国

发表于 2013-6-3 22:14:24 | 显示全部楼层
本人测试:
111耗时:0.469387
222耗时:0.704080
333耗时:1.139939
555耗时:0.342727

点评

多建立些多边形测试下,贴下结果。  详情 回复 发表于 2013-6-3 22:17
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-6-3 22:17:43 | 显示全部楼层
dnbcgrass 发表于 2013-6-3 22:14
本人测试:
111耗时:0.469387
222耗时:0.704080

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

使用道具 举报

已领礼包: 3255个

财富等级: 富可敌国

 楼主| 发表于 2013-6-3 22:24:42 | 显示全部楼层
晕倒,不知道你们在搞什么,不能修改我的程序,要不然算法就不公平了!!!我是在同一种算法下测试的!

点评

迷糊了啊,我为了讲究你的流程,MAPCAR分了好几段了,最后让dnbcgrass朋友又精简了下。 我的流程就是你的流程啊,把你效率低的地方给修改了。 你还不让修改你的代码,测试MAPCAR的效率。那是MAPCAR的问题吗?  详情 回复 发表于 2013-6-3 23:08
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3255个

财富等级: 富可敌国

 楼主| 发表于 2013-6-3 22:26:18 | 显示全部楼层
为什么你们用mapcar会这么快啊啊,我用mapcar会要好长时间。另外 千万不要改我的代码!!!

点评

因为我们的MAPCAR内部比你的效率高啊,你还不让改你的MAPCAR代码,那还测试什么啊。  详情 回复 发表于 2013-6-3 23:12
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3255个

财富等级: 富可敌国

 楼主| 发表于 2013-6-3 22:26:54 | 显示全部楼层
难道是我的cad问题,同样的代码 在我电脑上会相差这么大?

点评

17楼的代码和你的不一样了,你的MAPCAR里面很多降低效率的地方,你测试下17楼的和DNBCGRASS朋友的。 你怎么不让人家改你的代码啊,你的代码拖累了MAPCAR啊。 算法是和你一样的,只是改完了比你效率高。  详情 回复 发表于 2013-6-3 23:03
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-6-3 22:34:28 | 显示全部楼层
测试应该是在大家代码已经到了没办法再优化的基础上
才进行测试才有意义吧?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3739个

财富等级: 富可敌国

发表于 2013-6-3 22:40:28 | 显示全部楼层
算法是一致的:取多段线节点的坐标表放入表中。只不过是你选择了开汽车到罗马的方式,当然不如坐飞机快啦!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 21:42 , Processed in 0.745835 second(s), 55 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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