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
fonte
Respostas:
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.
fonte
Seguindo a sugestão do aterrel, você pode usar
pyximport
para compilar automaticamente orandom
módulo :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.
fonte
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
Tanto quanto eu entendo, você não precisa fazer nada de especial ao compilar.
Para reprodutibilidade durante o teste, você pode definir uma semente
fonte