IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaçage autre langage Python Discussion :

Interface Python/C++ que choisir ? vos avis svp


Sujet :

Interfaçage autre langage Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juillet 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 3
    Par défaut Interface Python/C++ que choisir ? vos avis svp
    Bonsoir

    Je poste ce message car je cherche m'exercer dans l'interfaçage Python/C++ et je voudrais avoir vos avis sur l'outil "optimal" à utiliser.

    J'ai un peu fait joujou avec SWIG (exemple de base sur une fonction) mais en recherchant sur internet, j'ai vu qu'il existait les outils suivants:
    - SWIG
    - Cython
    - SIP
    - Boost Python

    Quel est celui que vous me conseillerez d'utiliser et pourquoi ? Si vous avez eu l'occasion de vous en servir, pouvez-vous me faire part de vos retours ?

    En vous remerciant

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Avec C++, celui ayant meilleur réputation est boost, sinon pour l'interfaçage C/python je préfère cython.

    Ce qui m'a bloqué avec boost est la doc que je ne trouve pas toujours très clair.

    Bref pour C++, boost est très puissant.

    SWIG pour l'avoir testé, j'aime pas, pas adhérer, et je ne trouve pas très performant.

    SIP pas testé, donc je n'affirme rien.

  3. #3
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Dans la liste donnée, je ne connais que Cython, et je le trouve très intéressant. Comme il y a longtemps que je n'ai pas programmé en C/C++, j'apprécie de ne pas avoir à le faire...

    Un des avantages que j'y vois, c'est qu'en utilisant la solution "décorateur", on peut accélérer des fonctions Python sans modifier leur code.

    Si on accepte de programmer en Python en visant Cython, on peut utiliser directement les fonctions de la bibliothèque C (la doc parle aussi de C++). Par exemple, pour utiliser la fonction exp dans une fonction compilée Cython, il suffira de la définir comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cdef extern from "math.h": 
        double exp(double x)
    A noter tout de même que le gain en rapidité dépend de la "proximité" du codage Python par rapport au C. Par exemple, si on utilise à fond les structures de données Python qui n'existent pas en C (le "long" de Python par exemple), on oblige le code compilé à faire appel en permanence à l'API Python, ce qui fait qu'on ne gagne plus rien.

    Prenons un exemple: une fonction Python qui calcule e à la puissance x en passant par les séries.

    1- version en pur Python:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def expo1(x, eps=1e-15):
        """calcul de e puissance x par les séries"""
        n, t, s = 0, 1.0, 1.0
        while t/s>eps:
            n += 1
            t = t*x/n
            s = s + t
        return s
    2- version en Cython avec la solution "décorateur" => dans un fichier séparé appelé ici "test01bib.pyx" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    from cython import cclass, ccall, cfunc, returns as creturns, locals as clocals
    #############################################################################
    @ccall
    @creturns(double)
    @clocals(x=double, eps=double, n=int, t=double, s=double)
    def expo2(x, eps=1e-15):
        """calcul de e puissance x par les séries"""
        n, t, s = 0, 1.0, 1.0
        while t/s>eps:
            n += 1
            t = t*x/n
            s = s + t
        return s
    le décorateur "ccall" indique le type de fonction. Ici, ce sera une fonction qu'on pourra appeler à partir du C et à partir du Python. Il y a d'autres types: "cclass" pour une classe et "cfunc" pour appel uniquement à partir du C.

    Le reste est évident: on précise les types de données utilisées pour que le compilateur C sache quoi faire.

    On compile avec (ce qui fabrique "test01bib.pxd"):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    python setup.py build_ext --inplace
    Avec un setup.py qui contient (NB: pas de caractères accentués, même dans les commentaires!):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from distutils.core import setup
    from distutils.extension import Extension
    from Cython.Distutils import build_ext
     
    ext_modules = [Extension("test01bib", ["test01bib.pyx"])]
     
    setup(
      name = 'bibliotheque',
      cmdclass = {'build_ext': build_ext},
      ext_modules = ext_modules
    )
    Et on importe cette fonction compilée avec (elle sera extraite directement de "test01bib.pyd"):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from test01bib import expo2
    Voilà. On peut maintenant faire des essais pour comparer la solution en pur Python avec la solution Cython: avec 1 million de valeurs au hasard, la solution Cython est 10 fois plus rapide que la solution Python!

    Bonus: sous Windows, comme j'ai Visual C, Cython le prend par défaut. Quand je veux qu'il utilise plutôt mingw32, je place dans le même répertoire un fichier texte appelé "setup.cfg" contenant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [build]
    compiler = mingw32


    [Edit] J'ai dit plus haut qu'on pouvait utiliser directement les fonctions de bibliothèques C/C++. Cela veut dire qu'on peut créer facilement en Python compilé par Cython, une interface pour utiliser des bibliothèques C/C++ et les appeler directement à partir du code en pur Python. Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    cdef extern from "math.h": 
        double exp(double x)
     
    #############################################################################
    @ccall # pour appel possible par du C ou par du Python
    @creturns(double)
    @clocals(x=double)
    def exp2(x):
        """calcul de e puissance x par la bibliothèque C """
        return exp(x)
    Une fois compilé par Cython, ce code permettra à un programme en pur Python, après une simple importation, d'appeler exp2 qui appellera directement le exp de la bibliothèque C.

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Salut Tyrtamos,

    Si t'as une solution pour faire tourner du code C++ avec cython, je veux bien, du genre utiliser une fonction externe d'une bibliothèque créée en C++ dans un fichier de type pyx, je signe

    Sinon le C, ça passe nickel avec cython.

    Pour le C++, je suis très embêté...

  5. #5
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour fred1599,

    J'ai vu seulement que le sujet était abordé assez longuement dans la doc (http://wiki.cython.org/WrappingCPlusPlus).

    Il y a de plus un exemple qu'on peut télécharger (http://wiki.cython.org/WrappingCPlus...=cythoncpp.tgz), et qui parait assez simple.

    Si tu es dans le bain du C++: essaie, et dis si ça marche! Ça m'intéresse, mais je n'ai pas touché au C++ depuis pas mal de temps (2005) et j'ai "des trous dans mes lacunes"

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Eh bien écoute rien à faire

    Voici mon code C++, rien de plus simple

    test.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include <iostream>
     
    int add(int a, int b)
    {
        return a+b;
    }
    test.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef TEST_H_INCLUDED
    #define TEST_H_INCLUDED
     
    int add(int a, int b);
     
    #endif
    addition.pyx

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    cdef extern from "test.h":
        cdef int add(int, int)
     
     
    cpdef ajouter(a, b):
        cdef int val_1 = a
        cdef int val_2 = b
        cdef int result = add(val_1, val_2)
        return result
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cython addition.pyx --cplus
    Mon addition.cpp sort sans problème...

    setup.py

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    from distutils.core import setup, Extension
     
    ext = Extension(
        "ajout", ["addition.pyx"],
        language="c++",
        include_dirs=["/home/fred1599/Desktop"],
        libraries=['test'],
        extra_link_args=[],
        )
     
    setup (ext_modules = [Extension('test', ['test.cpp'])],)
    Fonctionne bien comme ci-dessous, mais même message d'erreur après l'import de la lib.

    Résultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ addition.cpp -o addition.so -shared -pthread -fPIC -fwrapv -O2 -Wall -fno-strict-aliasing $(pkg-config python --cflags)
    La compilation se passe bien, mais au niveau de l'import

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> import addition
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ImportError: ./addition.so: undefined symbol: _Z3addii
    Du coup si j'arrive à faire fonctionner ce petit code, ça roulera pour moi, mais rien à faire, alors qu'en C ça va tout seul.

Discussions similaires

  1. vos avis svp
    Par yan dans le forum Qt
    Réponses: 16
    Dernier message: 15/04/2008, 15h22
  2. [Config desktop] Vos avis svp
    Par guitou12 dans le forum Ordinateurs
    Réponses: 39
    Dernier message: 13/07/2007, 11h36
  3. Vos avis sur les Blog's SVP
    Par Marc Lussac dans le forum Evolutions du club
    Réponses: 9
    Dernier message: 16/02/2005, 15h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo