Depuis "Accélérer Python en fusionnant avec Cython C" O'Reilly J'ai essayé de tracer sur Ubuntu qu'une fonction écrite en langage C peut être importée et exécutée en Python.
Tout d'abord, l'exemple de ce livre est sur github, alors téléchargez-le sous forme de fichier zip. https://github.com/cythonbook/examples
Accédez au répertoire extrait. examples-master/07-wrapping-c/01-wrapping-c-functions-mt-random
Il y a un Makefile ici, alors essayez de le créer. Ensuite, il semble que les fichiers nécessaires ont été créés L'exemple p128 du même livre fonctionne à partir d'IPython. In [1]: import mt_random
In [2]: mt_random.init_state(42)
In [3]: mt_random.rand() Out[3]: 0.37454011439684315
Bien sûr, vous pouvez encapsuler les fonctions C en Cython comme décrit dans le livre.
Tout d'abord, il y a un fichier source C et un fichier d'en-tête.
mt.pxd
cdef extern from "mt19937ar.h":
void init_genrand(unsigned long s)
double genrand_real1()
mt_random.pyx
# distutils: sources=["mt19937ar.c"]
cimport mt
def init_state(unsigned long s):
mt.init_genrand(s)
def rand():
return mt.genrand_real1()
setup.py
from distutils.core import setup, Extension
from Cython.Build import cythonize
ext = Extension("mt_random",
sources=["mt_random.pyx", "mt19937ar.c"])
setup(name="mersenne_random",
ext_modules = cythonize([ext]))
Et le Makefile qui exécute setup.py était déjà inclus dans le fichier zip. Si vous faites cela, vous obtiendrez le résultat de l'exécution précédente.
J'ai trouvé que je pouvais l'envelopper en écrivant un fichier pxd, un fichier pyx, setup.py.
A propos du module mt_random implémenté de cette manière help(mt_random) Puis Il est également pratique d'afficher l'aide comme indiqué ci-dessous.
Help on module mt_random: NAME mt_random
FILE / (Omis) /examples-master/07-wrapping-c/01-wrapping-c-functions-mt-random/mt_random.so
FUNCTIONS init_state(...)
rand(...)
DATA test = {}
Pour comprendre plus que cet exemple, il semble lire le chapitre 7 du même livre.
Même si vous n'écrivez pas tout en C, écrivez uniquement le goulot d'étranglement en C Je suis heureux que l'écriture d'un wrapper en utilisant Cython soit suffisante.
Recommended Posts