"Cython" -Tutorial, um Python explosiv zu machen: Wenn eine Funktion auf der C ++ - Seite überlastet ist.

Überblick

Ich möchte in C ++ geschriebenen Code zu einer Bibliothek machen, die in Python aufgerufen werden kann. Es gab jedoch eine große Mauer namens Cython.

Dies ist das "Cython" -Tutorial, das Python explosiv macht: So analysieren Sie die in C ++ - Code definierte Enum-Klasse in Enum in Python. Dies ist eine Fortsetzung von.

Der Code ist unter "github hier" aufgeführt. Schauen Sie also bitte vorbei.

Beim letzten Mal habe ich erklärt, wie die in C ++ deklarierte Enum-Klasse an die Python-Seite Enum auf der Python-Seite übergeben wird, wenn eine in C ++ geschriebene Bibliothek nach Cython konvertiert wird, damit sie von Python aus verwendet werden kann.

Dieses Mal werde ich Cythonization erklären, wenn die Funktion auf der C ++ - Seite überladen ist (wenn die Konfiguration den gleichen Funktionsnamen, aber unterschiedliche Argumente hat).

Situationserklärung

Erstellen Sie die folgende Funktion auf der C ++ - Seite der Bibliothek, die Sie bisher geschrieben haben. Hier ist die Funktion `print_vector``` eine Funktion, die` vector `und` `vector <double>` als Argumente und in einem solchen Fall die Funktion verwenden kann Soll überlastet sein.

cpp_library/TestClass1.h



class TestClass1{
    private:
        TestClass2 property_test_class2;
        EnumForTestClass1 group;

    public:
        //~ Abkürzung
        static void print_vector(vector<int> x);
        static void print_vector(vector<double> x);

Der Inhalt ist nur eine Funktion zum Drucken des Inhalts des Vektors, wie unten gezeigt.

cpp_library/TestClass1.cpp


void TestClass1::print_vector(vector<int> x){
    for(int i=0; i<x.size(); i++){
        cout << x[i] << " ";
    }
    cout << endl;

}

void TestClass1::print_vector(vector<double> x){
    for(int i=0; i<x.size(); i++){
        cout << x[i] << " ";
    }
    cout << endl;

}

Cythonisierung

Rufen Sie diese `` `print_vector``` -Funktion wie im Beispiel von Cython aus auf.

cython/my_library.pxd


cdef extern from "../cpp_library/TestClass1.h" namespace "my_library":
    cdef cppclass TestClass1:
        #~ Abkürzung
        void print_vector(vector[int] x)
        void print_vector(vector[double] x)    

cython/test_class1.pxd


cdef extern from "../cpp_library/TestClass1.h" namespace "my_library":
    cdef cppclass TestClass1:
        #~ Abkürzung
        void print_vector(vector[int] x)
        void print_vector(vector[double] x)    

Hier implementieren wir den Inhalt in `` `cython / test_class1.pyx```.

cython/test_class1.pyx


    @staticmethod
    def print_vector(list x):
        cdef TestClass1 testclass1
        return testclass1.print_vector(x)

Wenn ich versuche, `python setup.py install `as auszuführen

Error compiling Cython file:
------------------------------------------------------------
...
        return testclass1.test_vector_int_ref(x,y) 

    @staticmethod
    def print_vector(list x):
        cdef TestClass1 testclass1
        return testclass1.print_vector(x)
                                     ^
------------------------------------------------------------

cython/test_class1.pyx:51:38: no suitable method found

Ich bekomme einen Fehler und werde wütend. .. Es ist natürlich, wenn Sie darüber nachdenken, aber weil die Funktion `` `print_vector``` auf der C ++ - Seite überladen ist, Sie wissen nicht, auf welche Funktion Sie sich beziehen. Um dies zu lösen, müssen Sie umwandeln und angeben, welche Funktion Sie aufrufen.

Schreiben Sie also `cython / test_class1.pyx `wie folgt um.

cython/test_class1.pyx


    @staticmethod
    def print_vector(list x):
        cdef TestClass1 testclass1
        
        if isinstance(x[0], int):
            return testclass1.print_vector(<vector[int]>x)
        elif isinstance(x[0], float):
            return testclass1.print_vector(<vector[double]>x)
        else:
            raise Exception('TypeError')

Dies geschieht, indem zuerst das Argument `x``` als` list``` und dann angegeben wird Welche Funktion auf der C ++ - Seite aufgerufen wird, hängt vom Inhaltstyp ab.

Wenn Sie es tatsächlich so schreiben, können Sie es mit `python setup.py install `erstellen.

test.py


import my_library as myl

if __name__ == "__main__":

    cl1 = myl.test()
    x = [1,2,3]
    y = [1.1, 2.2, 3.3]
    cl1.print_vector(x)
    cl1.print_vector(y)

Wenn Sie laufen und testen,

(myenv) root@e96f489c2395:/from_local/cython_practice# python test.py 
1 2 3 
1.1 2.2 3.3 

Sie sehen, dass die Funktion auf der C ++ - Seite erfolgreich aufgerufen werden kann.

Zusammenfassung

Dieses Mal habe ich Cythonization erklärt, wenn die Funktion auf der C ++ - Seite überladen ist (wenn die Konfiguration denselben Funktionsnamen, aber unterschiedliche Argumente hat).

Ich glaube, ich habe es behandelt, und was schreiben Sie sonst noch oft in C ++? Ich habe nicht entschieden, was ich als nächstes schreiben soll, also werde ich das nächste schreiben, sobald das Material entschieden ist.

Diesmal.

Ende.

Recommended Posts

"Cython" -Tutorial, um Python explosiv zu machen: Wenn eine Funktion auf der C ++ - Seite überlastet ist.
"Cython" -Tutorial, das Python explosiv macht: Handhabung, wenn Funktionen auf der C ++ - Seite als Referenz übergeben werden.
"Cython" -Tutorial, um Python explosiv zu machen: Übergeben Sie das C ++ - Klassenobjekt an das Klassenobjekt auf der Python-Seite. Teil 2
"Cython" -Tutorial, das Python explosiv macht: Wenn C ++ - Code von der Bibliothek abhängt. Vorbereitung
"Cython" -Tutorial, das Python explosiv macht: Wenn C ++ - Code von der Bibliothek abhängt. Schreiben Sie setup.py.
"Cython" -Tutorial, das Python explosiv macht: Wenn C ++ - Code von der Bibliothek abhängt. Zuallererst CMake.
"Cython" -Tutorial, um Python explosiv zu machen: So analysieren Sie die in C ++ - Code definierte Enum-Klasse mit Enum in Python.
"Cython" Tutorial, um Python explosiv zu machen: Grundkonfiguration
Machen Sie mit Python einen Haltepunkt auf der c-Ebene
[Python] Machen Sie die Funktion zu einer Lambda-Funktion
[Python] Smasher hat versucht, den Video-Ladevorgang mithilfe eines Generators zu einer Funktion zu machen
Umgang mit "^ [[A ^ [[B ^ [[C ^ [[D"]] beim Drücken der Richtungstaste beim Ausführen von Python auf dem Mac
Versuchen Sie, ein Python-Modul in C-Sprache zu erstellen
Eine Funktionsnotiz, die nützlich ist, wenn Sie den Debugger aufrufen möchten, wenn beim Ausführen eines Python-Skripts ein Fehler auftritt.
Python Gibt die Funktion an, die ausgeführt werden soll, wenn das Programm endet
[Python] Stellen Sie sicher, dass die empfangene Funktion eine benutzerdefinierte Funktion ist
[Python] So rufen Sie eine Funktion von c aus Python auf (ctypes edition)
[C / C ++] Übergeben Sie den in C / C ++ berechneten Wert an eine Python-Funktion, um den Prozess auszuführen, und verwenden Sie diesen Wert in C / C ++.
[Python] Hinweise beim Versuch, Numpy mit Cython zu verwenden
Wie erstelle ich ein Python-Paket (geschrieben für Praktikanten)
Wenn Sie einen UNIX-Befehl in Python ausführen möchten
[Python] Ich habe versucht, mit argparse ein einfaches Programm zu erstellen, das in der Befehlszeile funktioniert
Über den Fehler, den ich beim Versuch, Adafruit_DHT von Python auf Raspberry Pi zu verwenden, festgestellt habe
So machen Sie einen String in Python zu einem Array oder ein Array zu einem String
[Einführung in Python] So teilen Sie eine Zeichenfolge mit der Funktion split
Ein Spiel für ein Abenteuer im interaktiven Python-Modus
[Python3] Definition eines Dekorators, der die Ausführungszeit einer Funktion misst
[Python] Erklärt anhand eines Beispiels, wie die Formatierungsfunktion verwendet wird
Der Weg zur Installation von Python und Flask auf einem Offline-PC
[Python] Eine einfache Funktion zum Ermitteln der Mittelkoordinaten eines Kreises
Ich habe versucht, mit Python + OpenCV eine Bildähnlichkeitsfunktion zu erstellen
Erweiterung von Python um C oder C ++ (wenn es mehrere Argumente gibt, wenn eine Liste von der Python-Seite übergeben wird)
So erstellen Sie eine rekursive Funktion
[Python Tutorial] Eine einfache Einführung in Python
Dinge, auf die Sie beim Erstellen einer Python-Umgebung auf einem Mac achten sollten
[Python] Erklärt anhand eines konkreten Beispiels, wie die Bereichsfunktion verwendet wird
Python Hinweis: Wenn Sie die Attribute eines Objekts kennen möchten
[Python] Erstellen Sie einen Linebot, um den Namen und das Alter auf das Bild zu schreiben
Die eval () -Funktion, die eine Zeichenfolge als Ausdruck in Python berechnet
[Einführung in Python] So schreiben Sie eine Zeichenfolge mit der Formatierungsfunktion
[C-Sprache] Verwendung der Krypta-Funktion unter Linux [Passwort-Hashing]
Python: Ich möchte die Verarbeitungszeit einer Funktion genau messen
Ich habe eine Funktion erstellt, um die Bewegung eines zweidimensionalen Arrays (Python) zu sehen.
Vorsichtsmaßnahmen beim Beizen einer Funktion in Python
[Python] Ein Fortschrittsbalken auf dem Terminal
Eine Einführung in Python für C-Sprachprogrammierer
[19.11.2015] So registrieren Sie einen Dienst lokal mit dem Python SDK bei naoqi os
Machen Sie aus einem Python-Programm einen Daemon und führen Sie es automatisch aus, wenn das Betriebssystem gestartet wird
Im Chainer-Tutorial wird beim Importieren eines Pakets eine Fehlermeldung angezeigt. (spotten)
[Circuit x Python] So ermitteln Sie die Übertragungsfunktion eines Schaltkreises mit Lcapy
Bei der Konvertierung von CSV in JSON mit Python bin ich auf einen Zeichencode gestoßen
Sie können Python mithilfe der Bibliothek in eine AWS Lambda-Funktion verwandeln
Legen Sie die Obergrenze für die Anzahl der Wiederholungen rekursiver Funktionen in Python fest
[Python] Lösung für das Problem, dass Elemente beim Kopieren einer Liste verknüpft werden
[Python] Ich habe versucht, den Typnamen als Zeichenfolge aus der Typfunktion abzurufen
Stellen Sie unter Linux (Ubuntu) das Trackpad ein und stellen Sie die Funktion auf Drei-Finger-Wischen ein