I am trying to cythonise something I did which involves random number generation inside a parallelised loop. I wanted to use mtrand
but since it's Python code it can't work from a nogil
block and for some reason mtrand
's .pyx isn't exposed for the rest of us to use.
I know I can use rand
or any other C RNG (e.g. gsl
); is there a more standard way?
You have summed up the situation correctly. As of this writing, you can do one of three things:
Modify NumPy to allow sharing the declarations in mtrand.pxd
Use NumPy's random generators through their default interface (perhaps you could store all the random numbers in advance outside of the nogil
block?)
Use a random number generator written in C (or possibly C++ if you are having Cython generate C++ code).
Honestly, I'd probably do the last one. If you can use C++ 11, there are several good random number generators now included in the C++ standard library that you could use.