Publicité
+ Répondre à la discussion
Page 2 sur 2 PremièrePremière 12
Affichage des résultats 21 à 25 sur 25
  1. #21
    Expert Confirmé
    Avatar de tyrtamos
    Profil pro
    Inscrit en
    décembre 2007
    Messages
    2 271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2007
    Messages : 2 271
    Points : 3 753
    Points
    3 753

    Par défaut

    Bonjour,

    Ça y est!!!

    Voilà mon code test:

    bib.cpp

    Code :
    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 :
    1
    2
    int add_(int a, int b);
    int pgcd_(int a, int b);
    calcul.pyx

    Code :
    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 :
    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 :
    python setup.py build_ext --inplace
    Ce qui donne "calcul.pyd sous Windows, ou "calcul.so" sous Unix

    Utilisation:

    Code :
    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.
    Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos...
    Mes recettes python: http://www.jpvweb.com

  2. #22
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    5 318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 5 318
    Points : 7 416
    Points
    7 416

    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

  3. #23
    Membre Expert
    Avatar de fred1599
    Homme Profil pro Fred
    Enseignant
    Inscrit en
    juillet 2006
    Messages
    1 801
    Détails du profil
    Informations personnelles :
    Nom : Homme Fred
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2006
    Messages : 1 801
    Points : 2 440
    Points
    2 440

    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 Confirmé
    Avatar de tyrtamos
    Profil pro
    Inscrit en
    décembre 2007
    Messages
    2 271
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2007
    Messages : 2 271
    Points : 3 753
    Points
    3 753

    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 :
    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 :
    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.
    Ne rien ranger permet d'observer la loi universelle d'entropie: l'inévitable convergence vers le chaos...
    Mes recettes python: http://www.jpvweb.com

  5. #25
    Membre Expert
    Avatar de fred1599
    Homme Profil pro Fred
    Enseignant
    Inscrit en
    juillet 2006
    Messages
    1 801
    Détails du profil
    Informations personnelles :
    Nom : Homme Fred
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : juillet 2006
    Messages : 1 801
    Points : 2 440
    Points
    2 440

    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)

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •