|
From: Raymond T. <to...@rt...> - 2002-06-21 16:09:44
|
>>>>> "Michael" == Michael A Koerber <ma...@ll...> writes:
Michael> I noted the following yesterday...
Michael> * (time (setf tmp (m:seq 0 32767) done 'done))
Michael> Evaluation took:
Michael> 45.28 seconds of real time
Michael> 44.78 seconds of user run time
Michael> 0.01 seconds of system run time
Michael> 2 page faults and
Michael> 785416 bytes consed.
Michael> DONE
Michael> Looking at SEQ.LISP I'd blame %PUSH-ON-END%. Due to time constraints
Michael> I did a quick hack to use an ARRAY and coerce it to a LIST on return.
Michael> I DON'T KNOW IF THIS IS A GOOD FIX (the fastest and compatible with
Michael> other MATLISP internal uses or not), but it answered the mail for me
Michael> yesterday. This is the new timing...
Michael> * (time (setf tmp (seq 0 32767) done 'done))
Michael> Evaluation took:
Michael> 0.02 seconds of real time
Michael> 0.02 seconds of user run time
Michael> 0.0 seconds of system run time
Michael> 0 page faults and
Michael> 393224 bytes consed.
Michael> DONE
Michael> *
Thanks for the note! That is really bad.
Instead of an array, I've decided to just do (push x seq) and then
(nreverse seq) at the end. This is quite fast for me.
I've attached my proposed solution. It seems to be slightly faster
than your array solution and conses quite a bit less.
If you get a chance, let me know if this is better or not for you.
Ray
(defun seq (start step &optional end)
(when (not end)
(setq end step)
(setq step 1))
(let ((start (rationalize start))
(type (type-of step))
(step (rationalize step))
(end (rationalize end))
(seq nil))
(when (zerop step)
(error "STEP equal to 0"))
(do ((x start (+ x step)))
((if (> step 0)
(> x end)
(< x end))
(nreverse seq))
(push (coerce x type) seq))))
|