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 <moorepa...@gmail.com> 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 <crist...@umn.edu> 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 <moorepa...@gmail.com> >> 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 <mrock...@gmail.com> >>> wrote: >>> >>>> Cool >>>> >>>> >>>> On Wed, Aug 27, 2014 at 8:07 PM, James Crist <crist...@umn.edu> 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 sympy+unsubscr...@googlegroups.com. >>>>> To post to this group, send email to sympy@googlegroups.com. >>>>> 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 sympy+unsubscr...@googlegroups.com. >>>> To post to this group, send email to sympy@googlegroups.com. >>>> 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 >>> sympy+unsubscr...@googlegroups.com. >>> >>> To post to this group, send email to sympy@googlegroups.com. >>> 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 sympy+unsubscr...@googlegroups.com. >> To post to this group, send email to sympy@googlegroups.com. >> 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 > sympy+unsubscr...@googlegroups.com. > To post to this group, send email to sympy@googlegroups.com. > 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 sympy+unsubscr...@googlegroups.com. To post to this group, send email to sympy@googlegroups.com. 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. For more options, visit https://groups.google.com/d/optout.