Wrap C ++ mit Cython zur Verwendung von Python

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

Wickeln Sie C mit Cython für Python ein
Wrap C ++ mit Cython zur Verwendung von Python
Verwenden von C ++ - Funktionen aus Python mit pybind11
Rufen Sie C von Python mit DragonFFI auf
Tipps zum Aufrufen von Python von C.
Array-Pufferobjekt, das mit Cython verwendet werden kann
Wrap (Teil der) AtCoder Library in Cython zur Verwendung in Python
Verwenden Sie thingspeak aus Python
Verwenden Sie fließend Python
Verwenden Sie MySQL aus Python
Verwenden Sie vorerst Logger mit Python
Verwenden Sie Mecab mit Python 3
Verwenden Sie DynamoDB mit Python
Verwenden Sie Python 3.8 mit Anaconda
Verwenden Sie Python mit Docker
Verwenden Sie MySQL aus Python
Verwenden Sie BigQuery aus Python.
~ Tipps für Python-Anfänger mit Liebe von Pythonista ② ~
Verwenden Sie mecab-ipadic-neologd von Python
C-Sprache, Java, Python-Benchmarks mit Primfaktorisierung
Verwenden Sie Python, das von pyenv für die PL / Python-Ausführungsumgebung installiert wurde
Programmieren Sie überall mit Ihrem Smartphone! (Empfohlen für C-Sprache / Python)
Verwenden Sie die Trello-API mit Python
Verwenden Sie die Twitter-API mit Python
Verwenden Sie TUN / TAP mit Python
Verwenden Sie MySQL von Anaconda (Python)
Verwenden Sie Cython mit Jupyter Notebook
Verwenden Sie die Unterschall-API mit Python3
Mit Skype benachrichtigen Sie mit Skype von Python!
Verwenden Sie die e-Stat-API von Python
Verwenden wir nach Überprüfung mit Python eine Skriptsprache für eine komfortable C ++ - C ++ - Implementierung
Verwenden Sie IvyFEM (Finite-Elemente-Methodenbibliothek für .NET) aus Python
[Python] Hinweise beim Versuch, Numpy mit Cython zu verwenden
Einführung in Python für VBA-Benutzer - Aufrufen von Python aus Excel mit xlwings-
Abrufen von Daten aus der Analyse-API mit Google API Client für Python
Verwenden Sie eine Skriptsprache für ein komfortables C ++ - Leben - OpenCV-Port Python zu C ++ -
Python: So verwenden Sie Async mit
Verwenden Sie eine Point Grey-Kamera mit Python (PyCapture2).
Verwenden Sie vl53l0x mit RaspberryPi (Python)
Erstellen Sie Awaitable mit der Python / C-API
Verwenden von Rstan aus Python mit PypeR
Installieren Sie Python von der Quelle mit Ansible
Rufen Sie popcount von Ruby / Python / C # auf
Verwenden Sie NAIF SPICE TOOL KIT mit Python
Lesen und verwenden Sie Python-Dateien aus Python
Verwenden Sie als nächstes Python (Flask) für Heroku!
Verwenden Sie zwangsweise Google Translate aus Python
Python-Spickzettel (für C ++ erfahren)
Verwenden Sie rospy mit virtualenv in Python3
Löse ABC168 A ~ C mit Python
Führen Sie Aprili von Python auf Orange aus
Führen Sie Python-Code über die C # -GUI aus
Verwenden Sie Azure Blob Storage aus Python
Verwenden Sie die Flickr-API von Python
So verpacken Sie C in Python