[PYTHON] Augmentez la vitesse de la méthode Monte Carlo de l'implémentation de découpage Cython.

Aujourd'hui c'est Cython

J'ai écrit avant Implémentez rapidement la méthode Monte Carlo en Python.

L'implémentation utilisant Cython était trop omise, je vais donc la compléter.

Ceci est le code Python original

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()

C'est le Cython découpé

#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)

C'est bien qu'il soit passé d'environ 100 secondes à 17 secondes (mesuré avec un MacBook 12 pouces), mais je devrais pouvoir faire de mon mieux. Puisque la partie aléatoire est du code Python, il semble bon d'utiliser l'implémentation C ici.

Version améliorée de Cython

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)

Écrivons également setup.py.

#setup.py
from setuptools import setup, Extension

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

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

Vous pouvez créer un module en exécutant ce qui suit dans le terminal. Je pense que cela peut être fait sous Windows.

$ python setup.py build_ext --inplace

Après cela, écrivez le script principal pour l'exécuter.

#main.py
import monte
monte.monte()

Déplaçons-le.

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

Je l'ai réglé et c'est beaucoup plus rapide! Nous avons pu nous rapprocher le plus possible de l'implémentation de Numba et de l'implémentation de C ++.

Reference:

Monte Carlo Simulation with Cython

Recommended Posts

Augmentez la vitesse de la méthode Monte Carlo de l'implémentation de découpage Cython.
Calcul de l'itinéraire le plus court selon la méthode de Monte Carlo
Comparaison de vitesse de chaque langue par la méthode de Monte Carlo
Comprendre la méthode Metropolitan Hasting (une des méthodes de la méthode Monte Carlo en chaîne de Markov) avec implémentation
Trouvez le ratio de la superficie du lac Biwa par la méthode de Monte Carlo
Méthode de Monte Carlo
Essayez d'implémenter la méthode Monte Carlo en Python
La première méthode de Monte Carlo en chaîne de Markov par PyStan
Introduction à la méthode Monte Carlo
Comment augmenter la vitesse de traitement de l'acquisition de la position des sommets
Une implémentation Python simple de la méthode k-voisinage (k-NN)
Saupoudrer de grains de riz pour trouver le rapport de circonférence (méthode de Monte Carlo)
[Statistiques] Visualisez et comprenez la méthode Hamiltonian Monte Carlo avec animation.
J'ai essayé de résumer la méthode de mise en œuvre fréquemment utilisée de pytest-mock
Implémentation Einsum de la méthode d'itération de valeur
Simuler la méthode Monte Carlo en Python
Estimation de π par la méthode de Monte Carlo
Augmenter la taille de l'interface utilisateur de MyPaint
Je n'ai pas pu installer pypy3.6-7.3.1 avec macOS + pyenv, mais je pourrais installer pypy3.6-7.3.0. J'ai senti le vent du pypy par la méthode Monte Carlo.
Mise en œuvre et expérience de la méthode de clustering convexe
Compter / vérifier le nombre d'appels de méthode.
Othello-De la troisième ligne de "Implementation Deep Learning" (3)
Lire l'implémentation de la minuterie globale ARM
Othello-De la troisième ligne de "Implementation Deep Learning" (2)