geração de números aleatórios a partir do cython

8

Quero acelerar meu programa python usando cython, mas meu loop interno ainda está fazendo chamadas lentas de python para o gerador de números aleatórios! Vários anos atrás, esse mesmo problema foi levantado por alguém que apoiava os sábios e parecia não haver uma boa solução naquele momento. Não é conveniente para mim pré-gerar uma longa lista de amostras aleatórias porque, na verdade, estou amostrando várias distribuições de uma maneira que depende de amostras anteriores.

Aqui está uma postagem no blog explicando como isso foi julgado ao conectar-se do cython ao gsl:
http://pyinsci.blogspot.com/2010/12/efficient-mcmc-in-python-errata-and.html

E uma postagem de stackoverflow feita por alguém tentando implementar o gsl kludge:
/programming/8177446/random-number-generators-to-work-on-x86-64

Nenhum
fonte
Eu não entendo sua pergunta. Cython + GSL RNG é exatamente como eu implementaria isso. O que você gostaria de diferente?
Aron Ahmadia 04/04/12
@Aron: Talvez essa seja a resposta para minha pergunta - que Cython + GSL RNG ainda é a melhor maneira de fazer isso. O que eu gostaria de fazer diferente? Gostaria de evitar a dependência extra do gsl e evitar o clichê envolvido na vinculação a ela, mas entendo que a tecnologia para isso ainda pode não existir. Mas estou otimista de que estamos trabalhando nisso, por exemplo, em projetos como github.com/twiecki/CythonGSL .
nenhum

Respostas:

7

Cython torna o código mais rápido, removendo a ambiguidade do tipo. Como random.py é um módulo python puro, você pode simplesmente copiá-lo e adicionar os tipos às funções necessárias. Então, o cython pode otimizar a sobrecarga dinâmica.

aterrel
fonte
Na verdade, estou usando o numpy.random, mas essa é uma sugestão interessante para copiar e codificar o código nos pacotes que estou usando.
nenhum
5

Seguindo a sugestão do aterrel, você pode usar pyximportpara compilar automaticamente o randommódulo :

import pyximport
pyximport.install(pyimport=True)

import random

No entanto, isso ainda não será tão rápido quanto seria se você declarasse tipos estáticos para as variáveis ​​no Cython.

Jim Garrison
fonte
1
Bem-vindo ao site, Jim! Agradecimentos para o bom out-of-the-starting-gate de entrada :)
Aron Ahmadia
2

Não tenho certeza se eles foram adicionados recentemente, mas parece que agora existem maneiras fáceis de gerar números aleatórios rapidamente sem muita sobrecarga. A partir deste artigo sobre simulações de Monte Carlo em cython, podemos fazer

from libc.stdlib cimport rand, RAND_MAX
r = 1 + int(rand()/(RAND_MAX*6.0)) # random integer 1,...,6

Tanto quanto eu entendo, você não precisa fazer nada de especial ao compilar.

Para reprodutibilidade durante o teste, você pode definir uma semente

# srand48(time(0)) # Do it this way in production
srand48(100) # For reproducibility in testing
emschorsch
fonte