On 10/03/2013 02:33 PM, Stavros Macrakis wrote:
> Thanks for the improvement. I don't think you need to publish changes
like this to the whole mailing list. This is an optimization which
doesn't change the black-box behavior of the function.
>
> But since you have published it, I'll comment on it...: It's probably
not worth your while to make nano-optimizations like this. Though having
'first' be fast on long lists (which it already is) is probably somewhat
useful, saving 5mS on second(<long list>) is unlikely to matter to any
real program.
Maybe attaching a patch to a wishlist bug report (or low level bug or
whatever) is more appropriate? I'd be happy to take that approach.
Now that I think about it: A while ago, I published a limit for a
special function. There's not much to talk about there. I could have
sent that via the bug page. But, I looked at the list and saw that
others had published patches, so I went ahead.
But in the case at hand, I know that people have very different
opinions on optimization. So maybe it's useful for the
proposal to be visible.
--John
>
> -s
>
>
> On Thu, Oct 3, 2013 at 5:19 AM, John Lapeyre
<lapeyre.math122a at gmail.com> wrote:
>
> Greetings,
>
> second(), third(), etc. traverse the entire expression. But, they
> don't need to. Here is a change that fixes that.
>
> Example:
>
> a:create_list(i,i,1,10^6)$
>
> before change:
>
> for i:1 thru 100 do second(a);
> Evaluation took 0.4900 seconds (0.4860 elapsed)
>
> after change:
>
> for i:1 thru 100 do second(a);
> Evaluation took 0.0000 seconds (0.0000 elapsed)
>
> If it is decided that it should be applied, I can
> make the patch. But someone else can do it, too.
> Note especially that
> (make-nth second 2)
> was changed to
> (make-nth second 1), etc.
>
> --------
>
> (macrolet ((make-nth (si i)
> (let ((sim (intern (concatenate 'string "$" (symbol-name si)))))
> `(defmfun ,sim (e)
> (atomchk (setq e (format1 e)) ',sim nil)
> (handler-case
> (elt (margs e) ,i)
> (error ()
> (merror (intl:gettext "~:M: no such element in ~M") ',sim e)))))))
> ; (if (< (length (margs e)) ,i)
> ; (merror (intl:gettext "~:M: no such element in ~M") ',sim e))
> ; (,si (margs e))))))
>
> (make-nth second 1)
> (make-nth third 2)
> (make-nth fourth 3)
> (make-nth fifth 4)
> (make-nth sixth 5)
> (make-nth seventh 6)
> (make-nth eighth 7)
> (make-nth ninth 8)
> (make-nth tenth 9))
>
> _______________________________________________
> Maxima mailing list
> Maxima at math.utexas.edu
> http://www.math.utexas.edu/mailman/listinfo/maxima
>
>