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

Python Discussion :

cython probleme compilation en fichier pyd [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 27
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 2
    Par défaut cython probleme compilation en fichier pyd
    Bonjour
    J'ai suivi les instructions de la documentation de cython, mais j'ai du la mal comprendre. Aprés la création de mon code python pur(j'ai commencé avec l'exemple de helloworld), du fichier pyx et du fichier setup.py, j'ai executé et il y a eu création d'un fichier c ,selon la documentation il faut faire la commande python setup.py build_ext --inplace, mais j'ai toujours un syntax error, que je la fasse dans l'invite de commande sous python ou le python shell (peut être toute deux le mauvais endroit pour ce faire), j'ai essayé la commande avec g++ pour compiler, mais là aussi j'ai une erreur: fatal error: no input files. Je ne m'y connait pas du tout en language C, mais j'en ai besoin pour executer un algorithme genetique mettant une éternité si executé par python, voilà pourquoi je me suis orientée vers cython, mais voilà des jours que je galére dessus,
    Toute aide serai la bienvenue
    Je vous remerci d'avance

  2. #2
    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,

    Voilà un petit exemple basé sur le calcul du PGCD.

    Code en Python pur (fichier pgcd1.py):

    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 -*-
    # Python 3
     
    def pgcd1(a,b):
        """Plus Grand Commun Diviseur entre les 2 nombres entiers a et b
        """
        while b!=0:
            a,b = b,a%b
        return a
    Code pour Cython (fichier pgcd2.pyx):

    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 -*-
    # Python 3
     
    def pgcd2(int a, int b):
        """Plus Grand Commun Diviseur entre les 2 nombres entiers a et b
        """
        while b!=0:
            a,b = b,a%b
        return a
    On voit que la grosse différence est qu'il faut impérativement déclarer les types des variables utilisées pour que le compilateur C puisse savoir quoi faire.

    Voilà le setup.py utilisé:

    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("pgcd2",
                             sources=["pgcd2.pyx"],
                             include_dirs=["."],
                             language="c++"
                            )
                  ]
     
    setup(
      name = 'PGCD2',
      ext_modules = ext_modules,
      cmdclass = {'build_ext': build_ext}
    )
    Ici, j'ai utilisé le C++ et non le C.

    Comme j'ai fait ça sous Windows, on peut en plus choisir le compilateur. Si on a "Visual Studio", c'est ce compilateur par défaut qui sera utilisé. Mais si on veut utiliser plutôt mingw32, il faut le demander en créant un fichier texte "setup.cfg" situé dans le même répertoire que setup.py, et contenant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [build]
    compiler = mingw32
    Voilà le code à utiliser en console pour compiler (il faut se placer dans le répertoire du setup):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    python setup.py build_ext --inplace
    L'exécution donne:
    - un fichier pgcd2.cpp qui est le code source en C++
    - un répertoire build qui contient les données de travail
    - et un fichier pgcd2.pyd qui est le module C++ compilé en code natif, et qui peut être importé par le code Python pour être utilisé.

    En exécutant les 2 codes importés, celui en Python pur et celui en Python compilé en C++, on trouve un gain de temps de l'ordre de 80% (=> temps d'exécution divisé par 5).

    Attention cependant: il n'est pas impossible d'utiliser au sein du code Python à compiler, des objets Python qui n'existent pas en C (list, dict, ...). Mais dans ce cas, on voit une nette dégradation des résultats, parce que le code compilé en C est obligé de faire de nombreux appels à la bibliothèque Python. Dans certains cas (ça m'est déjà arrivé), le code compilé est moins bon en temps d'exécution que le code en pur Python!

    Pour traiter des cas plus complexes: voir la doc: http://docs.cython.org/en/latest/

    A noter qu'il y a une autre syntaxe, qui a le gros avantage de ne pratiquement pas modifier le code en Python pur, qui consiste à placer les déclarations de types de variables dans des décorateurs: http://docs.cython.org/en/latest/src/tutorial/pure.html

    Un dernier conseil: quand on a une fonction avec un temps d'exécution trop long, il faut en premier travailler l'algorithme en Python pur, et c'est seulement quand on est sûr qu'on ne peut pas faire mieux qu'on peut envisager une solution Cython!

    Je n'aurai pas le temps de t'aider plus: bonne chance pour la suite!

  3. #3
    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
    Citation Envoyé par NB000 Voir le message
    Bonjour
    J'ai suivi les instructions de la documentation de cython, mais j'ai du la mal comprendre. Aprés la création de mon code python pur(j'ai commencé avec l'exemple de helloworld), du fichier pyx et du fichier setup.py, j'ai executé et il y a eu création d'un fichier c ,selon la documentation il faut faire la commande python setup.py build_ext --inplace, mais j'ai toujours un syntax error, que je la fasse dans l'invite de commande sous python ou le python shell (peut être toute deux le mauvais endroit pour ce faire), j'ai essayé la commande avec g++ pour compiler, mais là aussi j'ai une erreur: fatal error: no input files. Je ne m'y connait pas du tout en language C, mais j'en ai besoin pour executer un algorithme genetique mettant une éternité si executé par python, voilà pourquoi je me suis orientée vers cython, mais voilà des jours que je galére dessus,
    Toute aide serai la bienvenue
    Je vous remerci d'avance
    Mais avant l'utilisation de cython, as-tu déjà fais le maximum en python en utilisant l'algorithme le plus performant ?

  4. #4
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Juin 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 27
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2017
    Messages : 2
    Par défaut
    Bonjour,
    Mon code comporte beaucoup de listes alors je vois que cython est une mauvaise solution,
    J'ai optimisé mon code python mais je ne sais pas si c'est le code le plus performant, je vais voir ce que je peux encore faire.
    Merci pour votre aide, tyrtamos et fred1599

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MASM] Compiler un fichier .sys ?
    Par - Robby - dans le forum x86 16-bits
    Réponses: 12
    Dernier message: 08/01/2008, 11h28
  2. probleme compilation classe avec Borland c++ compiler 5.5
    Par softblue dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 17/06/2004, 15h16
  3. [Debian] problème compilation jbuilder 9...
    Par Ancien_Do.Urden dans le forum JBuilder
    Réponses: 5
    Dernier message: 20/03/2004, 15h02
  4. Réponses: 2
    Dernier message: 25/10/2002, 22h19

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