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

  1. #21
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    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 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Ça y est!!!

    Voilà mon code test:

    bib.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include "bib.h"
     
    int add_(int a, int b){
        return a+b;
        }
     
    int pgcd_(int a, int b){
        int r;
        while (b!=0) {
            r = a%b;
            a = b;
            b = r;
            }
        return a;
        }
    bib.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int add_(int a, int b);
    int pgcd_(int a, int b);
    calcul.pyx

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from __future__ import division
    # Python 2.7
     
    from cpython cimport bool, list, dict, tuple, long as llong
     
    from cython import cclass, ccall, cfunc, returns as creturns, locals as clocals
     
    cdef extern from "bib.h": 
        cdef int add_(int x, int y)
        cdef int pgcd_(int a, int b)
     
    #############################################################################
    @ccall
    @creturns(int)
    @clocals(x=int, y=int)
    def add(x, y):
        """addition de x et y"""
        return add_(x,y)
     
    #############################################################################
    @ccall
    @creturns(int)
    @clocals(a=int, b=int)
    def pgcd(a, b):
        """PGCD de a et de b"""
        return pgcd_(a,b)
    setup.py:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    from distutils.core import setup
    from distutils.extension import Extension
    from Cython.Distutils import build_ext
     
    ext_modules = [Extension("calcul",
                             sources=["calcul.pyx", "bib.cpp"],
                             include_dirs=["."],
                             language="c++"
                            )
                  ]
     
    setup(
      name = 'Demos',
      ext_modules = ext_modules,
      cmdclass = {'build_ext': build_ext},
    )
    compilation en console par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    python setup.py build_ext --inplace
    Ce qui donne "calcul.pyd sous Windows, ou "calcul.so" sous Unix

    Utilisation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    from __future__ import division
    # Python 2.7
     
    from calcul import add, pgcd
     
    print add(7, 11)
     
    print pgcd(56,42)
    Ce qui donne les bons résultats (18 et 14)

    Contrairement à ce que je pensais, la partie de code en C++ (bib.cpp) n'est pas compilée en bibliothèque indépendante, mais liée au code Cython.

    J'ai essayé avec Windows (compilateur Visual C++ et mingw32) et Mint13 compatible Ubuntu 12.04: tout fonctionne parfaitement.

    A noter que l'exemple à télécharger fonctionne aussi parfaitement, et contient du code plus complexe (classes C++): si nécessaire, il pourrait être intéressant de s'y reporter.

    Ok?

    [Edit] niveau performance, la solution du pgcd directement codé en C++ est 4 fois plus rapide que la version en Python pourtant déjà rapide (merci Euclide!). Condition d'essai: 1 million de valeurs de a et de b au hasard, comprises entre 100 et 100000.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  2. #22
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Le wiki Cython contient des tutos montrant comment wrapper C++ ici.

    Pour répondre à la question du PO, l'outil le plus efficace dépend du contexte.

    Si le seul élément du contexte c'est vous, on peut supposer que vous découvrez ces sujets.

    Partez de construction C++ et regardez les difficultés que vous éprouvez à les mettre en œuvre dans un cas ou dans l'autre.
    Quelque soit l'outil que vous aurez choisi, pratiquez suffisamment longtemps pour faire le tour du sujet.

    Après avoir pris le temps de balayer le sujet avec un de ces outils, passer à un autre ne sera pas un gros soucis: tous ces outils font la même chose seule la mise en œuvre change.
    Bon courage,
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #23
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 817
    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 : 3 817
    Points : 7 110
    Points
    7 110
    Par défaut
    Bravo Tyrtamos!!!

    Je pige pas les import dans le pyx, tu peux m'expliquer d'où ils viennent, j'ai du zapper des choses dans le tuto?

    Sinon pourquoi tout ces décorateurs, je n'ai jamais utilisé cela dans un pyx, et dans beaucoup de fichiers exemples, je ne les vois pas non plus.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  4. #24
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    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 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour fred1599,

    Citation Envoyé par fred1599 Voir le message
    Je pige pas les import dans le pyx, tu peux m'expliquer d'où ils viennent, j'ai du zapper des choses dans le tuto?
    Pour le 1er:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from cpython cimport bool, list, dict, tuple, long as llong
    En principe, les types cités dans les déclarations de type sont ceux du C. Il s'agit ici d'introduire les types Python qui pourront être utilisés en Cython (il faudrait aussi "set", etc...). Et le dernier, le "long" de Python, a été rebaptisé par moi "llong" pour éviter le conflit avec le "long" du C (qui n'a pas une longueur arbitraire). Comme je l'ai déjà dit, on peut utiliser les types de Python qui n'existent pas en C, mais plus on le fait et moins c'est rapide. Je suis d'ailleurs déjà tombé sur une fonction plus longue à l'exécution en Cython qu'en pur Python à cause des "long" Python.

    Pour le 2e:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from cython import cclass, ccall, cfunc, returns as creturns, locals as clocals
    Ça va avec les décorateurs:
    - type d'objet: cclass: classe; cfunc: fonction appelable uniquement à partir du C; ccall: fonction appelable à partir du C et de Python.
    - creturns: déclare le type d'objet en retour.
    - clocals: déclare le type des arguments et des variables internes des fonctions.

    Citation Envoyé par fred1599 Voir le message
    Sinon pourquoi tout ces décorateurs, je n'ai jamais utilisé cela dans un pyx, et dans beaucoup de fichiers exemples, je ne les vois pas non plus.
    Parmi toutes les possibilités données par le manuel, j'ai choisi la solution "décorateur" (http://docs.cython.org/src/tutorial/pure.html), et ceci pour une raison très précise: dans le cas général, quand je veux accélérer une fonction Python par Cython, j'ai DEJA le code source Python, et je ne veux pas la réécrire! La solution des décorateurs me permet de ne pas avoir à modifier ce code Python mais seulement d'ajouter les déclarations qui manquent pour que Cython sache comment convertir en C! Je trouve ça très pratique.

    J'ai d'ailleurs pris la précaution de vérifier que cette solution n'était pas plus longue à l'exécution que la solution qui oblige à ré-écrire le code. Il n'y a que quelques petits problèmes qui restent à résoudre, comme par exemple les initialisations: quand on déclare que x est un "double" (type C), il faut l'initialiser par x=1.0 et non x=1 qui génère une erreur. Mais c'est seulement un bon réflexe à prendre...

    Ce n'est cependant pas une "assurance tout risque", car certains codes en pur Python ne se traduisent pas en Cython, ou ne donnent pas la meilleure performance souhaitée: dans ce cas, mais dans ce cas seulement, il faut repenser le code pour l'adapter à Cython.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  5. #25
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 817
    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 : 3 817
    Points : 7 110
    Points
    7 110
    Par défaut
    Ok, merci Tyrtamos, je vais analyser tes codes, relire la doc, dommage que je sois parti 3 jours, ça va me mettre en haleine pendant tout ce temps. Tu auras sûrement des retours d'ici vendredi ou samedi.

    Aussi je souhaiterais chercher une manière plus ressemblante à celle que j'utilisais avec du C et très simple.

    Je suis en train de voir du côté de ctypes qui semble bien plus simple pour appeler la lib, je vais chercher.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

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