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 :

Construire puis utiliser la version C d'une fonction faite en Python


Sujet :

Interfaçage autre langage Python

  1. #1
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut Construire puis utiliser la version C d'une fonction faite en Python
    Bonjour,
    j'ai la version Python suivante d'une fonction :
    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
    29
    30
    31
    #!/usr/bin/env python
     
    def combinaisonNonRecursif(k,n):
        """Calcul de C(k;n) = n! / k!(n-k)! en utilisant
            C(k;n) = C(k-1;n-1) + C(k;n-1)
     
        Voir le document trianglePascalParColone.pdf ou trianglePascalParColone.ods (via Open Office Calc).
        Il montre comment calculer de colonnes en colonnes."""
        if k==0 or k==n:
            return 1
     
        if k==1 or k==n-1:
            return n
     
    # Ici on utilise : C(n-k;n).
        test = n-k
        if k > test:
            k = test
     
        colonneInter = [0]*(n+1)
        colonne = [x for x in range(n+1)]
     
        for i in range(2, k+1):
            colonneInter[i] = 1
     
            for j in range(i+1, n+1):
                colonneInter[j] = colonneInter[j-1] + colonne[j-1]
     
            colonne = colonneInter[:] # Attention avec la copie des tableaux...
     
        return(colonne[n])
    Je voudrais en faire une version en langage C ou C++ pour ensuite l'appeler à partir de Python afin d'améliorer les performances de calcul.

    Toute info. est la bienvenue.

    PS : pour la compilation, j'ai Code Block sous Linux et XCode sous MacO$

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 271
    Points : 329
    Points
    329
    Par défaut
    Un bon exemple commenté :
    http://superjared.com/entry/anatomy-python-c-module/

    En gros je partirais sur ceci (code non testé) :
    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
     
    #include <Python.h>
     
    static PyObject * combnorecurs(PyObject *self, PyObject *args) {
        int k, n;
        // parsing des arguments : on veut deux entiers 
        if (!PyArg_ParseTuple(args, "ii", &k, &n)) {
            return NULL;
        }
        // calculs,  ... etc
        //!!!!!  La fonction doit retourner un PyObject* !!!!!!
        //(un PyObject* etant n importe quel type python) 
    }
     
    static PyMethodDef methods[] = {
        {"combnorecurs", (PyCFunction)combnorecurs, METH_O, "Combinaison non recursive"},
        {NULL, NULL}
    };
     
    PyMODINIT_FUNC initcombinaison(void)
    {
        Py_InitModule("combinaison", methods);
    }

  3. #3
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Super le lien. Je vais essayer ce soir chez moi...

  4. #4
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Petite question suit la lecture du lien (je ne peux pas encore tester pour le moment). Existe-t-il une procédure pour utiliser le code C en local, dans un dossier et non dans Python ? Je peux préciser ma question si elle manque de clarté.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 271
    Points : 329
    Points
    329
    Par défaut
    Si tu veux exécuter le code comme un programme binaire, je dirais non.

  6. #6
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Non, non. En fait, dans la page citée, le fichier est construit via distutils et se retrouve dans le path de Python. Du coup pour des tests, cela me fait un peu "peur"...

    De plus, si je veux distribuer mon code, il faudra donc que je fasse de même chez le futur utilisateur. Cela complique un peu les choses.

    Je vais déjà tenter de faire fonctionner l'exemple de la page citée.

  7. #7
    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 Cython?
    Si vous avez du temps, jetez un oeil la dessus: http://www.cython.org/
    Outre la possibilité d'écrire des interfaces pour le langage C, Cython peut aussi transformer des scripts Python en langage C.
    -W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Outre la possibilité d'écrire des interfaces pour le langage C, Cython peut aussi transformer des scripts Python en langage C.
    Cela a l'air intéressant...

    Citation Envoyé par wiztricks Voir le message
    Si vous avez du temps, ...
    Ce n'est pas urgent donc je prendrais le temps de tester les deux méthodes données dans ce post.

  9. #9
    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
    Citation Envoyé par rambc Voir le message
    Non, non. En fait, dans la page citée, le fichier est construit via distutils et se retrouve dans le path de Python. Du coup pour des tests, cela me fait un peu "peur"...
    Essaie d'apprendre à travailler avec virtualenv, ca permet d'avoir autant d'environnement Python ad hoc que l'on souhaite sans polluer l'installation 'système'.

    De plus, si je veux distribuer mon code, il faudra donc que je fasse de même chez le futur utilisateur. Cela complique un peu les choses.
    Je n'ai pas regardé cela plus précisément mais Py2exe devrait pouvoir permettre de livrer l'ensemble sans trop de soucis.
    -W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Finalement, je vais essayer avec Cython. Cela pourraot m're utile pour travailler avec des bibliothèques en C, et comme je vais peut-être me mettre au C et/ou au C++, cela tombe bien.

    Merci pour virtualenv.

    Par contre, Py2exe c'est pour Windaube et je viens de divorcer avec elle car j'en avais marre de ses sauts d'humeur et de sa tendance à voir bleu trop souvent.

  11. #11
    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
    Citation Envoyé par rambc Voir le message
    Par contre, Py2exe c'est pour Windaube et je viens de divorcer avec elle car j'en avais marre de ses sauts d'humeur et de sa tendance à voir bleu trop souvent.
    Au cas où tu as Py2app pour MacOSX et des équivalents sur les environnements Linux
    -W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Pour Cython, j'ai fait comme dans ce lient http://docs.cython.org/src/userguide/tutorial.html
    un simple programme en python de 30 lignes en sort 1600 ...
    Si vous avez mieux

  13. #13
    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
    Citation Envoyé par vistar76 Voir le message
    Pour Cython, j'ai fait comme dans ce lient http://docs.cython.org/src/userguide/tutorial.html
    un simple programme en python de 30 lignes en sort 1600 ...
    Si vous avez mieux
    Je n'ai pas mieux pour l'instant mais la communauté Python est suffisamment active pour nos apporter de bonnes surprises.

    Ceci dit, est-ce que vos attentes sont réalistes? raisonnables?

    Voir la présentation http://www.behnel.de/cython200910/talk.html

    Il faudrait voir ce qu'il y a dans le script mais çà fait du C qui tourne sans interpréteur Python... pour cela il va falloir un paquet de "define" et de routines de support qui font du volume mais qui sont du code C.
    Est ce qu'il tournera plus vite? Pas nécessairement, ca dépendra de ce qu'il fait...(*) mais c'est une traduction en C qui doit faire la même chose.

    Personnellement, je me sers de Cython pour optimiser le cas échéant des morceaux de code Python. Dans ce cas, Cython permet de définir l'API qui me permettra d'attaquer une librairie écrite "à la main" en C.

    -W
    PS: "à la main" au sens écrite par moi ou par d'autres mais dans une logique de programmeur C et non dans celle d'un translateur qui sera nécessairement bourrin.
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    J'ai mi de côte Cython car beaucoup trop long à modifier le code (mon application est trop grosse). Je suis pour le moment sur Shedskin mais le problème est de savoir comment faire pour importer certaine chose que Python appèle comme com, sys, socket... (et surtout pour moi win32api)

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    271
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 271
    Points : 329
    Points
    329
    Par défaut
    Tu peux utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PyObject* PyImport_ImportModule(const char *name)
    http://docs.python.org/c-api/import.html

    Par exemple pour importer sys.path :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    mm = PyImport_ImportModule("sys");
    md = PyModule_GetDict(mm);
    path = PyDict_GetItemString(md, "path");

  16. #16
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Salut

    Tu seras peut-être intéressé par ceci:
    http://www.scipy.org/Weave

    Je ne l'ai jamais testé, mais ça peut être sympa

  17. #17
    Membre chevronné

    Profil pro
    Account Manager
    Inscrit en
    Décembre 2006
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Account Manager

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 301
    Points : 1 752
    Points
    1 752
    Par défaut
    Merci pour toutes ces infos, y a de quoi bosser.

    J'adore ce forum...

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 23/05/2015, 19h31
  2. Réponses: 6
    Dernier message: 16/08/2010, 17h42
  3. Utilisation plusieurs versions IE sur une même machine
    Par ceweb dans le forum Balisage (X)HTML et validation W3C
    Réponses: 11
    Dernier message: 11/02/2010, 02h48
  4. Réponses: 1
    Dernier message: 28/09/2007, 15h59

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