Jim and others, Here are the benchmarks I made yesterday:
http://www.moorepants.info/blog/fast-matrix-eval.html The working code is here: https://gist.github.com/moorepants/6ef8ab450252789a1411 Any feedback is welcome. Jason moorepants.info +01 530-601-9791 On Wed, Aug 27, 2014 at 11:44 PM, James Crist <[email protected]> wrote: > I was wondering about that. I wasn't sure if the overhead from looping > through the inputs multiple times would outweigh improvements from fast C > loops. Glad that in your case it does. > > I've thrown a WIP PR up: https://github.com/sympy/sympy/pull/7929 > > For some reason, creating the functions in python with numpy calls still > seems to be faster (for micro-benchmarks). This probably has something to > do with function complexity (the example function above is simple), but I'd > still think it'd be faster in pure C. I tried inlining the call, which was > a small improvement, but it was still slower than the pure numpy-python > version. Something to look into. > > > On Wed, Aug 27, 2014 at 10:28 PM, Jason Moore <[email protected]> > wrote: > >> Yeh, but if you simply create a ufunc for each expression in a matrix you >> still get substantial speedups. I wrote a bunch of test cases that I'll >> post to my blog tomorrow. >> >> >> Jason >> moorepants.info >> +01 530-601-9791 >> >> >> On Wed, Aug 27, 2014 at 11:26 PM, James Crist <[email protected]> wrote: >> >>> Not yet. I wrote it this morning during an extremely boring meeting, and >>> haven't had a chance to clean it up. This doesn't solve your problem about >>> broadcasting a matrix calculation though... >>> >>> >>> On Wed, Aug 27, 2014 at 10:23 PM, Jason Moore <[email protected]> >>> wrote: >>> >>>> Awesome. I was working on this today but it looks like you've by passed >>>> what I had working. Do you have a PR with this? >>>> >>>> >>>> Jason >>>> moorepants.info >>>> +01 530-601-9791 >>>> >>>> >>>> On Wed, Aug 27, 2014 at 11:11 PM, Matthew Rocklin <[email protected]> >>>> wrote: >>>> >>>>> Cool >>>>> >>>>> >>>>> On Wed, Aug 27, 2014 at 8:07 PM, James Crist <[email protected]> wrote: >>>>> >>>>>> I still need to do some cleanups and add tests, but I finally have >>>>>> this working and thought I'd share. I'm really happy with this: >>>>>> >>>>>> In [1]: from sympy import * >>>>>> >>>>>> In [2]: a, b, c = symbols('a, b, c') >>>>>> >>>>>> In [3]: expr = (sin(a) + sqrt(b)*c**2)/2 >>>>>> >>>>>> In [4]: from sympy.utilities.autowrap import ufuncify >>>>>> >>>>>> In [5]: func = ufuncify((a, b, c), expr) >>>>>> >>>>>> In [6]: func(1, 2, 3) >>>>>> Out[6]: 6.7846965230828769 >>>>>> >>>>>> In [7]: func([1, 2, 3, 4, 5], [6, 7, 8, 9, 10], 3) >>>>>> Out[7]: array([ 11.44343933, 12.36052961, 12.79848207, 13.12159875 >>>>>> , 13.75078733]) >>>>>> >>>>>> In [8]: from numpy import arange >>>>>> >>>>>> In [9]: a = arange(10).reshape((2, 5)) >>>>>> >>>>>> In [10]: c = arange(10, 20).reshape((2, 5)) >>>>>> >>>>>> In [11]: b = 25 >>>>>> >>>>>> In [12]: func(a, b, c) >>>>>> Out[12]: >>>>>> array([[ 250. , 302.92073549, 360.45464871, 422.57056 , >>>>>> 489.62159875], >>>>>> [ 562.02053786, 639.86029225, 722.8284933 , 810.49467912, >>>>>> 902.70605924]]) >>>>>> >>>>>> In [13]: type(func) >>>>>> Out[13]: numpy.ufunc >>>>>> >>>>>> This now does everything a numpy `ufunc` does normally, as it *is* a >>>>>> ufunc. Codegen is hooked up to numpy api. Type conversion and >>>>>> broadcasting >>>>>> are done automagically. >>>>>> >>>>>> Caveats: only functions with a single output are accepted (this could >>>>>> be changed to accept multi-output without much effort though). Also, as >>>>>> with all unfuncs, input/outputs must all be scalars (no matrix/Indexed >>>>>> operations allowed). >>>>>> >>>>>> -- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "sympy" group. >>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>> send an email to [email protected]. >>>>>> To post to this group, send email to [email protected]. >>>>>> Visit this group at http://groups.google.com/group/sympy. >>>>>> To view this discussion on the web visit >>>>>> https://groups.google.com/d/msgid/sympy/76e0fbbe-5ce4-43b7-855b-6ac821f6b8ae%40googlegroups.com >>>>>> <https://groups.google.com/d/msgid/sympy/76e0fbbe-5ce4-43b7-855b-6ac821f6b8ae%40googlegroups.com?utm_medium=email&utm_source=footer> >>>>>> . >>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>> >>>>> >>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "sympy" group. >>>>> To unsubscribe from this group and stop receiving emails from it, send >>>>> an email to [email protected]. >>>>> To post to this group, send email to [email protected]. >>>>> Visit this group at http://groups.google.com/group/sympy. >>>>> To view this discussion on the web visit >>>>> https://groups.google.com/d/msgid/sympy/CAJ8oX-EHZXbd5aFFNRy7gJ0hcydpAsG2qxv7Py65DQ9cA9VUUA%40mail.gmail.com >>>>> <https://groups.google.com/d/msgid/sympy/CAJ8oX-EHZXbd5aFFNRy7gJ0hcydpAsG2qxv7Py65DQ9cA9VUUA%40mail.gmail.com?utm_medium=email&utm_source=footer> >>>>> . >>>>> >>>>> For more options, visit https://groups.google.com/d/optout. >>>>> >>>> >>>> -- >>>> You received this message because you are subscribed to a topic in the >>>> Google Groups "sympy" group. >>>> To unsubscribe from this topic, visit >>>> https://groups.google.com/d/topic/sympy/azVZHLOv9Vc/unsubscribe. >>>> To unsubscribe from this group and all its topics, send an email to >>>> [email protected]. >>>> >>>> To post to this group, send email to [email protected]. >>>> Visit this group at http://groups.google.com/group/sympy. >>>> To view this discussion on the web visit >>>> https://groups.google.com/d/msgid/sympy/CAP7f1AieaeoOFtc_S4XPxWOX2jr2zmda9VCRpWpzHMTGLkmHPQ%40mail.gmail.com >>>> <https://groups.google.com/d/msgid/sympy/CAP7f1AieaeoOFtc_S4XPxWOX2jr2zmda9VCRpWpzHMTGLkmHPQ%40mail.gmail.com?utm_medium=email&utm_source=footer> >>>> . >>>> >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "sympy" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to [email protected]. >>> To post to this group, send email to [email protected]. >>> Visit this group at http://groups.google.com/group/sympy. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/sympy/CAJ2L7mfL_xO%3DO-ZRMx-zfpZzJKJ-%2BUdTzSCz5jYf%2B%3DdovR%2B_7Q%40mail.gmail.com >>> <https://groups.google.com/d/msgid/sympy/CAJ2L7mfL_xO%3DO-ZRMx-zfpZzJKJ-%2BUdTzSCz5jYf%2B%3DdovR%2B_7Q%40mail.gmail.com?utm_medium=email&utm_source=footer> >>> . >>> >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> -- >> You received this message because you are subscribed to a topic in the >> Google Groups "sympy" group. >> To unsubscribe from this topic, visit >> https://groups.google.com/d/topic/sympy/azVZHLOv9Vc/unsubscribe. >> To unsubscribe from this group and all its topics, send an email to >> [email protected]. >> To post to this group, send email to [email protected]. >> Visit this group at http://groups.google.com/group/sympy. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/sympy/CAP7f1AjcHrsopXjwK5uYdALeSrokxLMwA7xebTikHyhwL-%2BOVg%40mail.gmail.com >> <https://groups.google.com/d/msgid/sympy/CAP7f1AjcHrsopXjwK5uYdALeSrokxLMwA7xebTikHyhwL-%2BOVg%40mail.gmail.com?utm_medium=email&utm_source=footer> >> . >> >> For more options, visit https://groups.google.com/d/optout. >> > > -- > You received this message because you are subscribed to the Google Groups > "sympy" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/sympy. > To view this discussion on the web visit > https://groups.google.com/d/msgid/sympy/CAJ2L7me73iJmkWm%3D_LiyWrsuOCZm%2B4OZbqD%2BkwwScWWx23HVdg%40mail.gmail.com > <https://groups.google.com/d/msgid/sympy/CAJ2L7me73iJmkWm%3D_LiyWrsuOCZm%2B4OZbqD%2BkwwScWWx23HVdg%40mail.gmail.com?utm_medium=email&utm_source=footer> > . > > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "sympy" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/sympy. To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/CAP7f1Agdi_X-o0B%2B9mH2CGOSN-TyYGVwgZm4q8%3DYwxieBzZkzA%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
