[PYTHON] Erhöhen Sie die Geschwindigkeit der Monte-Carlo-Methode zur Implementierung von Cython-Ausschnitten.

Heute ist Cython

Ich habe vorher geschrieben Implementieren Sie die Monte-Carlo-Methode schnell in Python.

Die Implementierung mit Cython war zu ausgelassen, daher werde ich sie ergänzen.

Dies ist der ursprüngliche Python-Code

import random
NUM=100000000
def monte():
    counter = 0
    for i in range(NUM):
        x = random.random()
        y = random.random()
        if x*x+y*y < 1.0:
            counter += 1
    pi = 4.0*counter/NUM
    print(pi)


def main():
    monte()

if __name__ == '__main__':
    main()

Dies ist der ausgeschnittene Cython

#monte.pyx
import random

cdef int NUM = 100000000

cdef cmonte():
    cdef :
        int counter = 0
        int i=0
        double x
        double y
    for i in range(NUM):
        x = random.random()
        y = random.random()
        if x*x + y*y < 1.0:
            counter += 1

    cdef double pi = 4.0*counter/NUM
    return pi

def monte():
    pi=cmonte()
    print(pi)

Es ist gut, dass es sich von ungefähr 100 Sekunden auf 17 Sekunden verkürzt hat (gemessen mit einem 12-Zoll-MacBook), aber ich sollte in der Lage sein, mein Bestes zu geben. Da der zufällige Teil Python-Code ist, scheint es gut, hier die C-Implementierung zu verwenden.

Cython verbesserte Version

from libc.stdlib cimport rand, RAND_MAX

cdef int NUM = 100000000

def monte():
    cdef :
        int counter = 0
        int i=0
        double x
        double y
    for i in range(NUM):
        x = (rand()+1.0)/(RAND_MAX+2.0)
        y = (rand()+1.0)/(RAND_MAX+2.0)
        if x*x + y*y < 1.0:
            counter += 1

    pi = 4.0*counter/NUM
    print(pi)

Schreiben wir auch setup.py.

#setup.py
from setuptools import setup, Extension

ext_modules = [
    Extension(
        name='monte',
        sources=['monte.pyx']
        )
]

setup(
    name = 'cymonte',
    ext_modules = ext_modules
)

Sie können ein Modul erstellen, indem Sie im Terminal Folgendes ausführen. Ich denke, dass es unter Windows gemacht werden kann.

$ python setup.py build_ext --inplace

Schreiben Sie danach das Hauptskript, um es auszuführen.

#main.py
import monte
monte.monte()

Lass es uns bewegen.

$ time python main.py
real	0m2.081s
user	0m1.935s
sys 	0m0.070s

Ich habe es eingestellt und es ist viel schneller! Wir konnten der Implementierung von Numba und der Implementierung von C ++ so nahe wie möglich kommen.

Reference:

Monte Carlo Simulation with Cython

Recommended Posts

Erhöhen Sie die Geschwindigkeit der Monte-Carlo-Methode zur Implementierung von Cython-Ausschnitten.
Berechnung der kürzesten Route nach der Monte-Carlo-Methode
Geschwindigkeitsvergleich jeder Sprache nach der Monte-Carlo-Methode
Verstehen Sie die Metropolitan Hasting-Methode (eine der Methoden in der Markov-Ketten-Monte-Carlo-Methode) mit der Implementierung
Finden Sie das Verhältnis der Fläche des Biwa-Sees nach der Monte-Carlo-Methode
Monte-Carlo-Methode
Versuchen Sie, die Monte-Carlo-Methode in Python zu implementieren
Die erste Markov-Ketten-Monte-Carlo-Methode von PyStan
Einführung in die Monte-Carlo-Methode
So erhöhen Sie die Verarbeitungsgeschwindigkeit der Erfassung der Scheitelpunktposition
Eine einfache Python-Implementierung der k-Neighborhood-Methode (k-NN)
Mit Reiskörnern bestreuen, um das Umfangsverhältnis zu ermitteln (Monte-Carlo-Methode)
[Statistik] Visualisieren und verstehen Sie die Hamiltonsche Monte-Carlo-Methode mit Animation.
Ich habe versucht, die häufig verwendete Implementierungsmethode von pytest-mock zusammenzufassen
Einsum Implementierung der Wertiterationsmethode
Simulieren Sie die Monte-Carlo-Methode in Python
Schätzung von π nach der Monte-Carlo-Methode
Erhöhen Sie die Benutzeroberfläche von MyPaint
Ich konnte pypy3.6-7.3.1 nicht mit macOS + pyenv installieren, aber ich konnte pypy3.6-7.3.0 installieren. Ich fühlte den Wind von Pypy nach der Monte-Carlo-Methode.
Implementierung und Experiment der konvexen Clustering-Methode
Zählen / überprüfen Sie die Anzahl der Methodenaufrufe.
Othello-Aus der dritten Zeile von "Implementation Deep Learning" (3)
Lesen Sie die Implementierung des globalen ARM-Timers
Othello-Aus der dritten Zeile von "Implementation Deep Learning" (2)