xinxirong 发表于 2016-10-31 14:45:08

获得列表内指定索引范围内的列表,求优化

;提取表         表 开始 结束索引值
;例:(setq a '(1 2 3 4 5 6 7 8 9))
;用法:(tiqulst a 3 6)
;当一个表是一个1M以上的文件的字符串,vl-string->list后就会很慢,半个小时都有
(defun tiqulst (lst sta end / newpl num)
(if (< end (+ (length lst) 1))
    (progn
      (setq t1 (getvar "CDATE"));记录开始时间
      (setq newpl '())
      (repeat (- end sta)
(setq num (list (nth sta lst)))
(setq newpl (appendnewpl num))
(setq sta (1+ sta))
)
      )
    ;else
    (alert "tiqulst中end大于lst的长度")
    )
(setq t2 (* (- (getvar "CDATE") t1) 1e6));秒
(princ "\ntiqulst用时")
(princ t2)
newpl
)说白了,就是substr,但转成string之后会丢数据。如果是C语言就简单得多,1秒都不用。

llsheng_73 发表于 2016-11-3 12:07:03

(defun tt (lst sta end / newpl num)
(setq t1 (getvar "CDATE"));记录开始时间
(repeat(-(min end(length lst))(setq sta(max 0 sta)))
    (setq newpl(cons(nth sta lst)newpl)
          sta(1+ sta)))
(princ "\ntt用时")
(princ (* (- (getvar "CDATE") t1) 1e6))
(reverse newpl))
好象没什么可优化的,差不多就只能这样了

xinxirong 发表于 2016-11-4 13:59:22

我用arx写的,1M的列表瞬间提取。
static int ads_subList(void)
{
//函数的参数 ((1 2 3 4 ..) start end)
struct resbuf *pArgs =acedGetArgs () ;
struct resbuf *ret;
//SHORT *buf =new SHORT;//最大1M
int count=0;
pArgs=pArgs->rbnext;
pArgs=pArgs->rbnext;//跳过RTLE
int start=pArgs->resval.rlong;
pArgs=pArgs->rbnext;
int end=pArgs->resval.rlong;
pArgs =acedGetArgs()->rbnext ;
int i=0;
while(i<start && pArgs->restype==RTSHORT)
{
pArgs=pArgs->rbnext;
i++;
}
ret=pArgs;
i=1;
while(i<end-start && pArgs->rbnext->restype==RTSHORT)
{
pArgs=pArgs->rbnext;
i++;
}
pArgs->rbnext=NULL;
return acedRetList(ret);
acutRelRb(ret);
}
页: [1]
查看完整版本: 获得列表内指定索引范围内的列表,求优化