Schnellste Weg, um füllen numpy-array mit Zufallszahlen
Gibt es einen schnelleren Weg, um ein numpy-array gefüllt mit Zufallszahlen als die integrierten numpy.random.rand(count)
Funktion? Ich weiß, dass die eingebaute Methode ist die Verwendung des Mersenne Twister.
Möchte ich nutzen, numpy für die monte-carlo-Simulationen, und das abrufen der Zufallszahlen nimmt einen erheblichen Teil der Zeit. Ein einfaches Beispiel, Berechnung von pi durch monte-carlo-integration mit 200E6 Zufallszahlen ist nur die Verarbeitung über 116.8 MB/s durch mein Programm. Ein comprable Programm geschrieben in C++ mit xor128() als generator verarbeitet mehrere hundert MB/s.
EDIT: Falsch berechnet generation rate
- erzeugen einer Datei und laden Sie von dort? nicht die beste, aber wahrscheinlich die einfachste.
- Wenn alle Stricke reißen, können Sie immer schreiben Sie Ihre eigene random fill Funktion, die in C oder C++: docs.scipy.org/doc/numpy/user/c-info.how-to-extend.html
- Das problem ist, dass ich habe Simulationen laufen lange genug, um Hunderte von Terabyte an Daten.
- Sind Sie timing die ganze simulation, oder einfach nur die random number generation? (Wenn Sie das timing der Zufallszahl-generation, sind beide Programme produzieren eine ganze Reihe von zahlen, oder hat der C++ - code zu verwerfen, jede Zahl, die vor der Produktion des nächsten?)
- Ich bin das timing der gesamten simulation, aber ich kann sehen, aus cProfile, dass die
random.rand
Funktion nimmt eine Menge Zeit. Der C++ - code-Puffer über 10000 zahlen auf einmal. Das python-Programm arbeitet auf volle Größe arrays. - Durch das hinzufügen einer Schleife, um das python-Programm, so dass die einzelnen numpy-array ist kleiner hat mehr Geschwindigkeit. Sie sind ziemlich vergleichbar jetzt, python=4,2 Sekunden, C++=3.38 Sekunden. Sowohl die Durchführung in mehreren hundert MB/s jetzt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie könnte vielleicht bekommen eine leichte performance-Steigerung durch eine Verringerung der Genauigkeit -, wenn dies zumutbar ist. Ich habe dies mithilfe der
randint
und Skalierung:Mit ipython
%%timeit