Zufallszahlengenerierung aus Cython

8

Ich möchte mein Python-Programm mit Cython schnell machen, aber meine innere Schleife führt immer noch langsame Python-Aufrufe an den Zufallszahlengenerator durch! Vor einigen Jahren wurde dasselbe Problem von jemandem angesprochen, der Salbei unterstützt, und es schien zu diesem Zeitpunkt keine gute Lösung zu geben. Es ist für mich nicht bequem, eine lange Liste von Zufallsstichproben vorab zu erstellen, da ich tatsächlich Stichproben aus verschiedenen Verteilungen auf eine Weise mache, die von früheren Stichproben abhängig ist.

Hier ist ein Blog-Beitrag, in dem erklärt wird, wie dies durch die Verbindung von Cython zu GSL behoben wurde:
http://pyinsci.blogspot.com/2010/12/efficient-mcmc-in-python-errata-and.html

Und ein Stackoverflow-Beitrag von jemandem, der versucht, den gsl-Kludge zu implementieren:
/programming/8177446/random-number-generators-to-work-on-x86-64

keiner
quelle
Ich verstehe deine Frage nicht. Cython + GSL RNG ist genau das, was ich implementieren würde. Was möchten Sie anders?
Aron Ahmadia
@Aron: Vielleicht ist das die Antwort auf meine Frage - dass Cython + GSL RNG immer noch der beste Weg ist, dies zu tun. Was möchte ich anders machen? Ich möchte die zusätzliche gsl-Abhängigkeit vermeiden und die Boilerplate vermeiden, die mit der Verknüpfung verbunden ist, aber ich verstehe, dass die Technologie dafür möglicherweise noch nicht vorhanden ist. Ich bin jedoch optimistisch, dass wir darauf hinarbeiten , beispielsweise mit Projekten wie github.com/twiecki/CythonGSL .
keine

Antworten:

7

Cython beschleunigt den Code, indem die Typmehrdeutigkeit beseitigt wird. Da random.py ein reines Python-Modul ist, können Sie es einfach kopieren und die Typen zu den Funktionen hinzufügen, die Sie benötigen. Dann kann Cython den dynamischen Overhead weg optimieren.

aterrel
quelle
Ich verwende tatsächlich numpy.random, aber dies ist ein interessanter Vorschlag, um den Code in den von mir verwendeten Paketen zu kopieren und zu cythonisieren.
keine
5

Nach aterrel Vorschlag, könnten Sie verwenden , pyximportum automatisch das kompilieren randomModul :

import pyximport
pyximport.install(pyimport=True)

import random

Dies macht es jedoch immer noch nicht so schnell, wie es wäre, wenn Sie statische Typen für die Variablen in Cython deklarieren würden.

Jim Garrison
quelle
1
Willkommen auf der Seite, Jim! Vielen Dank für die nette Eingabe von
Anfang an
2

Ich bin mir nicht sicher, ob diese kürzlich hinzugefügt wurden, aber es scheint, dass es jetzt einfache Möglichkeiten gibt, Zufallszahlen schnell und ohne allzu großen Aufwand zu generieren. Aus diesem Artikel über Monte-Carlo-Simulationen in Cython können wir machen

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

Soweit ich weiß, müssen Sie beim Kompilieren nichts Besonderes tun.

Zur Reproduzierbarkeit während des Tests können Sie einen Samen setzen

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