thread-safe random number generation with cython

2020-04-11 04:39发布

问题:

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?

回答1:

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.