Tutoriel "Cython" pour rendre Python explosif: Lorsqu'une fonction côté C ++ a une surcharge.

Aperçu

Je veux faire du code écrit en C ++ une bibliothèque qui puisse être appelée en Python. Cependant, il y avait un grand mur appelé Cython.

Voici le tutoriel "Cython" qui rend Python explosif: Comment analyser la classe Enum définie dans le code C ++ dans Enum en Python. Ceci est une continuation de.

Le code est répertorié dans "github here", veuillez donc y jeter un œil.

La dernière fois, j'ai expliqué comment passer la classe Enum déclarée en C ++ à la classe Enum du côté Python lors de la conversion d'une bibliothèque écrite en C ++ en Cython afin qu'elle puisse être utilisée à partir de Python.

Cette fois, j'expliquerai la Cythonisation lorsque la fonction côté C ++ est surchargée (lorsque la configuration a le même nom de fonction mais des arguments différents).

Explication de la situation

Créez la fonction suivante du côté C ++ de la bibliothèque que vous avez écrite jusqu'à présent. Ici, la fonction print_vector``` est une fonction qui peut prendre vector <int> et vector <double> '' comme arguments, et dans un tel cas, la fonction On dit qu'il est surchargé.

cpp_library/TestClass1.h



class TestClass1{
    private:
        TestClass2 property_test_class2;
        EnumForTestClass1 group;

    public:
        //~ abrégé
        static void print_vector(vector<int> x);
        static void print_vector(vector<double> x);

Le contenu n'est qu'une fonction pour imprimer le contenu du vecteur comme indiqué ci-dessous.

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;

}

Cythonalisation

Pensez à appeler cette fonction `` print_vector '' à partir de Cython comme dans l'exemple.

cython/my_library.pxd


cdef extern from "../cpp_library/TestClass1.h" namespace "my_library":
    cdef cppclass TestClass1:
        #~ abrégé
        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:
        #~ abrégé
        void print_vector(vector[int] x)
        void print_vector(vector[double] x)    

Ici, nous allons implémenter le contenu de cython / test_class1.pyx```.

cython/test_class1.pyx


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

Quand j'essaye d'exécuter python setup.py install` '' comme

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

J'obtiens une erreur et je me fâche. .. C'est naturel quand on y pense, mais parce que la fonction print_vector``` côté C ++ est surchargée, Vous ne savez pas à quelle fonction vous faites référence. Pour résoudre ce problème, vous devez effectuer un cast et spécifier la fonction que vous appelez.

Alors, réécrivez cython / test_class1.pyx` '' comme suit.

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')

Ceci est fait en spécifiant d'abord l'argument x comme `` `` liste et ensuite La fonction appelée côté C ++ est spécifiée par le type de son contenu.

Si vous l'écrivez réellement comme ceci, vous pouvez le construire avec python setup.py install` ``,

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)

Lorsque vous exécutez et testez,

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

Vous pouvez voir que la fonction côté C ++ peut être appelée avec succès.

Résumé

Cette fois, j'ai expliqué la Cythonisation lorsque la fonction côté C ++ est surchargée (lorsque la configuration a le même nom de fonction mais des arguments différents).

Je pense que je l'ai couvert, et qu'écrivez-vous souvent en C ++? Je n'ai pas décidé quoi écrire ensuite, alors j'écrirai le suivant dès que le matériel sera décidé.

Cette fois-ci.

fin.

Recommended Posts

Tutoriel "Cython" pour rendre Python explosif: Lorsqu'une fonction côté C ++ a une surcharge.
Tutoriel "Cython" qui rend Python explosif: Gérer le passage de fonctions côté C ++ par référence.
Tutoriel "Cython" pour rendre Python explosif: Passez l'objet de classe C ++ à l'objet de classe côté Python. Partie 2
Tutoriel "Cython" qui rend Python explosif: lorsque le code C ++ dépend de la bibliothèque. Préparation
Tutoriel "Cython" qui rend Python explosif: lorsque le code C ++ dépend de la bibliothèque. Écrivez setup.py.
Tutoriel "Cython" qui rend Python explosif: lorsque le code C ++ dépend de la bibliothèque. Tout d'abord, CMake.
Tutoriel "Cython" pour rendre Python explosif: Comment analyser la classe Enum définie en code C ++ vers Enum en Python.
Tutoriel "Cython" pour rendre Python explosif: configuration de base
Faire un point d'arrêt sur la couche c avec python
[Python] Faire de la fonction une fonction lambda
[Python] Smasher a essayé de faire du processus de chargement de la vidéo une fonction à l'aide d'un générateur
Comment gérer "^ [[A ^ [[B ^ [[C ^ [[D"]] en appuyant sur la touche de direction lors de l'exécution de python sur mac
Essayez de créer un module Python en langage C
Un mémo de fonction utile lorsque vous souhaitez entrer dans le débogueur si une erreur se produit lorsque vous exécutez un script Python.
python Spécifie la fonction à exécuter lorsque le programme se termine
[Python] Assurez-vous que la fonction reçue est une fonction définie par l'utilisateur
[Python] Comment appeler une fonction de c depuis python (édition ctypes)
[C / C ++] Passez la valeur calculée en C / C ++ à une fonction python pour exécuter le processus et utilisez cette valeur en C / C ++.
[python] Remarques lors de la tentative d'utilisation de numpy avec Cython
Comment créer un package Python (écrit pour un stagiaire)
Lorsque vous souhaitez lancer une commande UNIX sur Python
[Python] J'ai essayé de créer un programme simple qui fonctionne sur la ligne de commande en utilisant argparse
À propos de l'erreur que j'ai rencontrée en essayant d'utiliser Adafruit_DHT à partir de Python sur Raspberry Pi
Comment transformer une chaîne en tableau ou un tableau en chaîne en Python
[Introduction à Python] Comment fractionner une chaîne de caractères avec la fonction split
Un jeu pour partir à l'aventure en mode interactif de python
[Python3] Définition d'un décorateur qui mesure le temps d'exécution d'une fonction
[Python] Explique comment utiliser la fonction format avec un exemple
La route pour installer Python et Flask sur un PC hors ligne
[Python] Une fonction simple pour trouver les coordonnées du centre d'un cercle
J'ai essayé de créer une fonction de similitude d'image avec Python + OpenCV
Extension de Python par C ou C ++ (lorsqu'il y a plusieurs arguments, lors du passage d'une liste du côté Python)
Comment créer une fonction récursive
[Tutoriel Python] Une introduction facile à Python
Points à surveiller lors de la création d'un environnement Python sur un Mac
[Python] Explique comment utiliser la fonction range avec un exemple concret
Remarque Python: lorsque vous souhaitez connaître les attributs d'un objet
[Python] Créez un linebot pour écrire le nom et l'âge sur l'image
Fonction Eval () qui calcule une chaîne de caractères comme expression en python
[Introduction à Python] Comment écrire une chaîne de caractères avec la fonction format
[Langage C] Comment utiliser la fonction crypt sous Linux [Hachage de mot de passe]
Python: je souhaite mesurer proprement le temps de traitement d'une fonction
J'ai créé une fonction pour voir le mouvement d'un tableau à deux dimensions (Python)
Précautions lors du décapage d'une fonction en python
[Python] Une barre de progression sur le terminal
Une introduction à Python pour les programmeurs en langage C
[2015/11/19] Comment enregistrer un service localement à l'aide du SDK python avec naoqi os
Transformez un programme Python en démon et exécutez-le automatiquement au démarrage du système d'exploitation
Dans le tutoriel Chainer, j'obtiens une erreur lors de l'importation d'un package. (moquer)
[Circuit x Python] Comment trouver la fonction de transfert d'un circuit en utilisant Lcapy
Je suis tombé sur un code de caractère lors de la conversion de CSV en JSON avec Python
N'hésitez pas à transformer Python en utilisant la bibliothèque en une fonction AWS Lambda
Définir la limite supérieure du nombre de répétitions de fonctions récursives en Python
[Python] Solution au problème que les éléments sont liés lors de la copie d'une liste
[Python] J'ai essayé d'obtenir le nom du type sous forme de chaîne de caractères à partir de la fonction type
Sous Linux (Ubuntu), réglez le Trackpad et réglez la fonction sur un balayage à trois doigts