News for hackers. Stuff that matters.
Re:Extending Python with Rust by jacquesm on Tuesday December 27, 2022 @05:41AM (#34147475)
NumPy is insanely fast for most use cases, I've (grudgingly) come to the conclusion that if NumPy doesn't hack it then I should re-think the problem or my way of solving it rather than to try to optimize that particular bit of code if it isn't meant for something that is going to be run in production on a large number of machines. Likely there are better uses of my time. It's interesting how what is nominally a scripting language can perform so well for compute intensive tasks. Of course, technically you are just stringing together highly optimized low level functions together using the Python language but the advantages of doing it that way have more often than not surprised me.
Re:Extending Python with Rust by ThePhysicist on Tuesday December 27, 2022 @06:30AM (#34147768)
A long time (10 years) ago I wrote some custom C++ code to perform relatively simple arithmetic operations on very large arrays, which was considerably slower in Numpy for some reason [1]. As I said that was long ago so maybe Numpy has improved by now, but back then there was a significant penalty when doing these operations directly in Python using Numpy, even though they were only a handful of things (e.g. calculate asin(x)+bcos(y) on some large array), so I didn't expect much overhead from going back and forth between Numpy-internal code and Python.

1: https://github.com/adewes/python-qubit-setup/blob/master/lib...

Re:Extending Python with Rust by rapatel0 on Tuesday December 27, 2022 @07:13AM (#34147982)
This

Op is better off recompiling numpy to target his specific hardware thank trying to speed it up using rust. This would be to try different underlying math implementations that are linked with numpy ( blas, mkl, eigen). Each of these haha several internal simulation frameworks to optimize not just the actual instructions but memory layout for various math kernels.

Re:Extending Python with Rust by kzrdude on Tuesday December 27, 2022 @07:55AM (#34148203)
How do you handle it in numpy if you want something like ((x - y)/2 + z) * w all elementwise over the arrays? Naively that's 3 intermediate unused arrays being created.
Re:Extending Python with Rust by zarzavat on Tuesday December 27, 2022 @08:10AM (#34148287)
There's plenty of CPU and GPU numpy accelerators available.

* Numba: https://numba.pydata.org/

* JAX: https://jax.readthedocs.io/en/latest/notebooks/quickstart.ht...

Re:Extending Python with Rust by kzrdude on Tuesday December 27, 2022 @08:13AM (#34148305)
numba - instead of writing in Rust, you write it in numba, which is also almost like another language. Not bad, but needs to be taken into account and is not pure numpy.
Re:Extending Python with Rust by korijn on Tuesday December 27, 2022 @09:07AM (#34148744)
Inplace operators?
Re:Extending Python with Rust by europeanguy on Tuesday December 27, 2022 @09:10AM (#34148769)
You use Julia and let loop fusion handle it. You get 1 allocation if you want to store the result in a new array, or zero allocations if you already have the array allocated.

https://julialang.org/blog/2017/01/moredots/

Re:Extending Python with Rust by zozbot234 on Tuesday December 27, 2022 @09:50AM (#34149131)
Isn't that what Theano/Aesara is for? Still based on a NumPy interface AIUI, but automagically compiling from NumPy-based to efficient code on the CPU or GPU.
Re:Extending Python with Rust by CraigJPerry on Tuesday December 27, 2022 @11:06AM (#34149838)
Is there an optimal solution to that for all sizes of the arrays?

E.g. I’d expect for small/medium then re-writing as a fold over the input arrays would be fastest because you’d only traverse once & everything would fit in cache.

However if the 3 arrays combined size is larger than L1 cache, I’d be strongly tempted to bet on the naïve 3 operation approach to be faster. You’d save so much time on cache line flush / reload activities.

But then if 2 arrays are larger than L3 i’d expect going back to the fold / single traversal to win again because the iterating 2 arrays at a time behaviour is no longer any different to iterating 3 at a time.

Untested hypothesis.

Re:Extending Python with Rust by pmeira on Tuesday December 27, 2022 @04:53PM (#34154362)
Re:Extending Python with Rust by pillefitz on Tuesday December 27, 2022 @08:24AM (#34148371)
Implementing the hot path in e.g. C, compiling it into a lib an calling it using e.g. ctypes is very little effort and can yield dramatic runtime improvements / reduced bill. It's been an excellent use of my time, at least.

I'd recommend using Numba first, though.