Quiero hacer que mi programa de Python sea rápido usando cython, ¡pero mi ciclo interno todavía está haciendo llamadas lentas de Python al generador de números aleatorios! Hace varios años, alguien con el apoyo de Sage planteó este mismo problema y parecía que no había una buena solución en ese momento. No es conveniente para mí generar previamente una larga lista de muestras aleatorias porque en realidad estoy tomando muestras de varias distribuciones de una manera que está condicionada a muestras anteriores.
Aquí hay una publicación en el blog que explica cómo se corrigió esto al conectarse de cython a gsl:
http://pyinsci.blogspot.com/2010/12/efficient-mcmc-in-python-errata-and.html
Y una publicación de stackoverflow de alguien que intenta implementar el gsl kludge:
/programming/8177446/random-number-generators-to-work-on-x86-64
fuente
Respuestas:
Cython acelera el código al eliminar la ambigüedad de tipo. Dado que random.py es un módulo de Python puro, puede copiarlo y agregar los tipos a las funciones que necesita. Entonces, Cython puede optimizar la sobrecarga dinámica.
fuente
Siguiendo la sugerencia de aterrel, puede usar
pyximport
para compilar automáticamente elrandom
módulo :Sin embargo, esto aún no lo hará tan rápido como lo sería si declarara tipos estáticos para las variables en Cython.
fuente
No estoy seguro de si se agregaron recientemente, pero parece que ahora hay formas fáciles de generar números aleatorios rápidamente sin demasiados gastos generales. De este artículo sobre simulaciones de Monte Carlo en cython podemos hacer
Por lo que yo entiendo, no necesitas hacer nada especial al compilar.
Para la reproducibilidad durante las pruebas, puede establecer una semilla
fuente