Hinweis: Die folgenden Artikel sind veraltet.
Erwägen Sie die Verwendung von pybind11.
[Python-Beschleunigung] c ++ integriert von pybind11
"Python durch Fusion mit Cython C beschleunigen" Von O'Reilly Ich habe versucht, unter Ubuntu zu verfolgen, dass eine in C ++ geschriebene Funktion in Python importiert und ausgeführt werden kann. Das Beispiel dieses Buches befindet sich zunächst auf Github. Laden Sie es daher als Zip-Datei herunter. https://github.com/cythonbook/examples Wechseln Sie in das extrahierte Verzeichnis. examples-master/08-wrapping-cxx/01-simple-example-mt_rng-class
Quellcode in C ++ geschrieben mt19937.h mt19937.cpp
Deklaration des externen C-Codes in Cython (Erweiterung .pxd) C ++ - Klassenumbruch (Erweiterung .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()
Setup.py-Datei, die Ihnen das Kompilieren erklärt
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))
Von hier an versuche ich, Cython zu interpretieren, aber es kann falsch sein. Bitte beziehen Sie sich auf das gleiche Buch.
Deklaration von externem C ++ - Code in Cython (Erweiterung .pxd)
Wie schreibe ich pxd Datei
cdef extern from "C++Header-Datei in" namespace "C++Namensraum in":
C++Konstanten, die durch const static in der Header-Datei von definiert sind
unsigned int N
cdef cppclass C++Klassenkennung in:
Konstruktor()
Konstruktor(unsigned long s)
Konstruktor(unsigned long init_key[], int key_length)
C in Cython unter öffentlichen Methoden verwendet++Methodendeklaration
void init_genrand(unsigned long s)
unsigned long genrand_int32()
double genrand_real1()
double operator()()
In der von github heruntergeladenen Datei lautet die Deklaration von externem C ++ - Code in Cython Sie haben in eine Pyx-Datei migriert.
Beschreibung zur Pyx-Datei hinzugefügt, um anzugeben, dass es sich um eine C ++ - Sprache handelt # distutils: language = c++
cdef cppclass MT_RNG:
In der Blockbeschreibung von wird die Definition der Klasse und der öffentlichen Methode in der Referenzquelle C ++ beschrieben.
Wie schreibe ich eine Pyx-Datei
cdef class Klassenkennung in Cython:
cdef MT_RNG *_thisptr
def __cinit__(self, unsigned long s):
Beschreibung des Konstruktors
C in dieses eingewickelt werden++Erstellen Sie eine Instanz der Klasse von.
Das erste Selbst des Arguments ist im Fall der Python-Klasse üblich.
self._thisptr = new MT_RNG(s)
if self._thisptr == NULL:
raise MemoryError()
def __dealloc__(self):
Spezielle Methode zum Aufräumen
if self._thisptr != NULL:
del self._thisptr
Geben Sie den Methodennamen in cpdef Cython ein(self,Streit):
Implementierung von Methoden in der Cython-Syntax
Dabei wird C von cdef extern deklariert++Funktionen und Methoden stehen zur Verfügung.
return Rückgabewert
cpdef unsigned long randint(self):
return self._thisptr.genrand_int32()
cpdef double rand(self):
return self._thisptr.genrand_real1()
setup.Wie schreibe ich py
from distutils.core import setup, Extension
from Cython.Build import cythonize
ext = Extension("Name der Python-Erweiterung",
sources=["Der Name der Pyx-Datei", "cpp Dateiname"],
language="c++")
setup(name="RNG",
ext_modules=cythonize(ext))
Unterschied zur C-Version: ext = Extension () hat jetzt language = "c ++" hinzugefügt.
Ergänzung: Es ist auch möglich, Sprachelementdeklarationen auf C-Ebene in pyx-Dateien anstelle von pxd-Dateien aufzunehmen. Es ist jedoch besser, es als separate pxd-Datei für die Wartung aufzubewahren. als Versuch, cdef extern from "mt19937.h" namespace "mtrandom": Auch wenn Sie den Block beginnend mit aus der Pyx-Datei in die Pyd-Datei extrahieren und kompilieren Erfolgreicher Aufbau und Betrieb.
URL: Tutorial zum Cython-Dokument (japanische Übersetzung) http://omake.accense.com/static/doc-ja/cython/src/tutorial/index.html
Recommended Posts