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