Hi Francesc, Those numbers are really eye-popping! But the formatting of the code as a string still bugs me a lot. Asking this as a totally naive user, do you know whether PEP523 <https://www.python.org/dev/peps/pep-0523/> (adding a frame evaluation API) would allow numexpr to have a more Pythonic syntax? eg.
with numexpr: y = np.sin(x) * np.exp(newfactor * x) ? Juan. > On 24 Jul 2019, at 6:39 pm, Francesc Alted <fal...@gmail.com> wrote: > > (disclosure: I have been a long time maintainer of numexpr) > > An important thing to be noted is that, besides avoiding creating big > temporaries, numexpr has support for multi-threading out of the box and Intel > VML for optimal evaluation times on Intel CPUs. For choosing your best bet, > there is no replacement for experimentation: > > https://gist.github.com/FrancescAlted/203be8a44d02566f31dae11a22c179f3 > <https://gist.github.com/FrancescAlted/203be8a44d02566f31dae11a22c179f3> > > I have no time now to check for memory consumption, but you can expect > numexpr and Numba consuming barely the same amount of memory. Performance > wise things are quite different, but this is probably due to my inexperience > with Numba (in particular, paralellism does not seem to work for this example > in Numba 0.45, but I am not sure why). > > Cheers! > > > Probably numba has this too, but my attempts to use parallelism failed > > Missatge de Sebastian Berg <sebast...@sipsolutions.net > <mailto:sebast...@sipsolutions.net>> del dia dc., 24 de jul. 2019 a les 1:32: > On Tue, 2019-07-23 at 13:38 -0500, Stanley Seibert wrote: > > (Full disclosure: I work on Numba...) > > > > Just to note, the NumPy implementation will allocate (and free) more > > than 2 arrays to compute that expression. It has to allocate the > > result array for each operation as Python executes. That expression > > is equivalent to: > > > > That is mostly true, although – as Hameer mentioned – on many platforms > (gcc compiler is needed I think) a bit of magic happens. > > If an array is temporary, the operation is replaced with an in-place > operation for most python operators calls. For example: > `-abs(arr1 * arr2 / arr3 - arr4)` > should only create a single new array and keep reusing it in many > cases[0]. You would achieve similar things with `arr1 *= arr2` > manually. > > Another thing is that numpy will cache some arrays, so that the > allocation cost itself may be avoided in many cases. > > NumPy does no "loop fusing", i.e. each operation is finished before the > next is started. In many cases, with simple math loop fusing can give a > very good speedup (which is wher Numba or numexpr come in). Larger > speedups are likely if you have large arrays and very simple math > (addition). [1] > > As Stanley noted, you probably should not worry too much about it. You > have `exp`/`sin` in there, which are slow by nature. You can try, but > it is likely that you simply cannot gain much speed there. > > Best, > > Sebastian > > > [0] It requires that the shapes all match and that the result arrays > are obviously temporary. > [1] For small arrays overheads may be avoided using tools such as > numba, which can help a lot as well. If you want to use multiple > threads for a specific function that may also be worth a look. > > > s1 = newfactor * x > > s2 = np.exp(s1) > > s3 = np.sin(x) > > y = s3 * s2 > > > > However, memory allocation is still pretty fast compared to special > > math functions (exp and sin), which dominate that calculation. I > > find this expression takes around 20 milliseconds for a million > > elements on my older laptop, so that might be negligible in your > > program execution time unless you need to recreate this decaying > > exponential thousands of times. Tools like Numba or numexpr will be > > useful to fuse loops so you only do one allocation, but they aren't > > necessary unless this becomes the bottleneck in your code. > > > > If you are getting started with NumPy, I would suggest not worrying > > about these issues too much, and focus on making good use of arrays, > > NumPy array functions, and array expressions in your code. If you > > have to write for loops (if there is no good way to do the operation > > with existing NumPy functions), I would reach for something like > > Numba, and if you want to speed up complex array expressions, both > > Numba and Numexpr will do a good job. > > > > > > On Tue, Jul 23, 2019 at 10:38 AM Hameer Abbasi < > > einstein.edi...@gmail.com <mailto:einstein.edi...@gmail.com>> wrote: > > > Hi Ram, > > > > > > No, NumPy doesn’t have a way. And it newer versions, it probably > > > won’t create two arrays if all the dtypes match, it’ll do some > > > magic to re use the existing ones, although it will use multiple > > > loops instead of just one. > > > > > > You might want to look into NumExpr or Numba if you want an > > > efficient implementation. > > > > > > Get Outlook for iOS > > > > > > From: NumPy-Discussion < > > > numpy-discussion-bounces+einstein.edison=gmail....@python.org > > > <mailto:gmail....@python.org>> on > > > behalf of Ram Rachum <r...@rachum.com <mailto:r...@rachum.com>> > > > Sent: Tuesday, July 23, 2019 7:29 pm > > > To: numpy-discussion@python.org <mailto:numpy-discussion@python.org> > > > Subject: [Numpy-discussion] Creating a sine wave with exponential > > > decay > > > > > > Hi everyone! Total Numpy newbie here. > > > > > > I'd like to create an array with a million numbers, that has a sine > > > wave with exponential decay on the amplitude. > > > > > > In other words, I want the value of each cell n to be sin(n) > > > * 2 ** (-n * factor). > > > > > > What would be the most efficient way to do that? > > > > > > Someone suggested I do something like this: > > > > > > y = np.sin(x) * np.exp(newfactor * x) > > > But this would create 2 arrays, wouldn't it? Isn't that wasteful? > > > Does Numpy provide an efficient way of doing that without creating > > > a redundant array? > > > > > > > > > > > > Thanks for your help, > > > > > > Ram Rachum. > > > > > > _______________________________________________ > > > NumPy-Discussion mailing list > > > NumPy-Discussion@python.org <mailto:NumPy-Discussion@python.org> > > > https://mail.python.org/mailman/listinfo/numpy-discussion > > > <https://mail.python.org/mailman/listinfo/numpy-discussion> > > > > _______________________________________________ > > NumPy-Discussion mailing list > > NumPy-Discussion@python.org <mailto:NumPy-Discussion@python.org> > > https://mail.python.org/mailman/listinfo/numpy-discussion > > <https://mail.python.org/mailman/listinfo/numpy-discussion> > _______________________________________________ > NumPy-Discussion mailing list > NumPy-Discussion@python.org <mailto:NumPy-Discussion@python.org> > https://mail.python.org/mailman/listinfo/numpy-discussion > <https://mail.python.org/mailman/listinfo/numpy-discussion> > > > -- > Francesc Alted > _______________________________________________ > NumPy-Discussion mailing list > NumPy-Discussion@python.org > https://mail.python.org/mailman/listinfo/numpy-discussion
_______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@python.org https://mail.python.org/mailman/listinfo/numpy-discussion