Performance with simple numpy arrays
Created originally on Bitbucket by paugier (Pierre Augier)
I’m having a look at how much Python is bad with callbacks of tiny functions (https://github.com/paugier/bench_integrate_callback). I was motivated by a benchmark from Julia people showing than Julia is much faster than Scipy for ODEs integration with tiny callback functions (https://github.com/JuliaDiffEq/SciPyDiffEq.jl).
I thought that PyPy could be good to accelerate scipy.integrate.solve_ivp
since the code of solve_ivp (https://github.com/scipy/scipy/tree/master/scipy/integrate/_ivp) is mostly “simple” Python using “simple” Numpy. However, it’s much slower with PyPy.
I isolated a very simple case with a callback to check what happens.
With a pure Python version (https://github.com/paugier/bench_integrate_callback/blob/master/purepython_callback.py), PyPy is 30 times faster than CPython! However, with a versions for which the time values are stored in a Numpy array (https://github.com/paugier/bench_integrate_callback/blob/master/numpy_callback.py), PyPy is 54 times slower than for the version for which the time values are stored in a list (therefore nearly 2 times slower than CPython).
The only difference between the 2 scripts is times = dt * np.arange(1e5)
instead of times = [dt * it for it in range(int(1e5))]
. Of course, most of the elapsed time is not spent in this line but in the loop.
It’s sad that PyPy can’t accelerate Python code using simple Numpy. I realized that it is not something new, but still I’d like to ask if there is any chance that PyPy could be improved in that respect.