Remarque: les articles suivants sont obsolètes.
Pensez à utiliser pybind11.
[Accélération Python] c ++ intégré par pybind11
"Accélérer Python en fusionnant avec Cython C" De 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/08-wrapping-cxx/01-simple-example-mt_rng-class
Code source écrit en C ++ mt19937.h mt19937.cpp
Déclaration de code C externe en Cython (extension .pxd) Wrap de classe C ++ (extension .pyx)
RNG.pyx
# distutils: language = c++
# distutils: sources = mt19937.cpp
cdef extern from "mt19937.h" namespace "mtrandom":
unsigned int N
cdef cppclass MT_RNG:
MT_RNG()
MT_RNG(unsigned long s)
MT_RNG(unsigned long init_key[], int key_length)
void init_genrand(unsigned long s)
unsigned long genrand_int32()
double genrand_real1()
double operator()()
cdef class RNG:
cdef MT_RNG *_thisptr
def __cinit__(self, unsigned long s):
self._thisptr = new MT_RNG(s)
if self._thisptr == NULL:
raise MemoryError()
def __dealloc__(self):
if self._thisptr != NULL:
del self._thisptr
cpdef unsigned long randint(self):
return self._thisptr.genrand_int32()
cpdef double rand(self):
return self._thisptr.genrand_real1()
Fichier Setup.py qui vous indique comment compiler
py.setup.py
from distutils.core import setup, Extension
from Cython.Build import cythonize
ext = Extension("RNG",
sources=["RNG.pyx", "mt19937.cpp"],
language="c++")
setup(name="RNG",
ext_modules=cythonize(ext))
À partir de là, j'essaye d'interpréter Cython, mais c'est peut-être faux. Veuillez vous référer au même livre.
Déclaration de code C ++ externe en Cython (extension .pxd)
Comment écrire un fichier pxd
cdef extern from "C++Fichier d'en-tête dans" namespace "C++Espace de nom dans":
C++Constantes définies par const static dans le fichier d'en-tête de
unsigned int N
cdef cppclass C++Identifiant de classe dans:
Constacteur()
Constacteur(unsigned long s)
Constacteur(unsigned long init_key[], int key_length)
C utilisé en Cython parmi les méthodes publiques++Déclaration de méthode
void init_genrand(unsigned long s)
unsigned long genrand_int32()
double genrand_real1()
double operator()()
Dans le fichier téléchargé depuis github, la déclaration du code C ++ externe en Cython est Vous avez migré vers un fichier pyx.
Ajout d'une description au fichier pyx pour spécifier qu'il s'agit d'un langage C ++ # distutils: language = c++
cdef cppclass MT_RNG:
Dans la description de bloc de, la définition de la classe et de la méthode publique dans la source de référence C ++ est décrite.
Comment écrire un fichier pyx
cdef class Identifiant de classe en Cython:
cdef MT_RNG *_thisptr
def __cinit__(self, unsigned long s):
Description du constructeur
C pour être enveloppé dans ce++Créez une instance de la classe de.
Le premier self de l'argument est commun au cas de la classe Python.
self._thisptr = new MT_RNG(s)
if self._thisptr == NULL:
raise MemoryError()
def __dealloc__(self):
Méthode spéciale pour nettoyer
if self._thisptr != NULL:
del self._thisptr
Tapez le nom de la méthode dans cpdef Cython(self,argument):
Implémentation de méthodes dans la syntaxe Cython
En cela, C déclaré par cdef extern++Les fonctions et méthodes sont disponibles.
return Valeur de retour
cpdef unsigned long randint(self):
return self._thisptr.genrand_int32()
cpdef double rand(self):
return self._thisptr.genrand_real1()
setup.Comment écrire py
from distutils.core import setup, Extension
from Cython.Build import cythonize
ext = Extension("Nom de l'extension python",
sources=["Nom du fichier pyx", "nom de fichier cpp"],
language="c++")
setup(name="RNG",
ext_modules=cythonize(ext))
Différence par rapport à la version C: ext = Extension () a maintenant language = "c ++" ajouté.
Supplément: Il est également possible d'inclure des déclarations d'élément de langage de niveau C dans des fichiers pyx au lieu de fichiers pxd. Cependant, il est préférable de le conserver dans un fichier pxd séparé pour la maintenance. à titre d'essai, cdef extern from "mt19937.h" namespace "mtrandom": Même si vous extrayez le bloc en commençant par du fichier pyx vers le fichier pyd et le compilez Construction et opération réussies.
URL: Tutoriel de document Cython (traduction japonaise) http://omake.accense.com/static/doc-ja/cython/src/tutorial/index.html
Recommended Posts