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 :

Python vs Cython vs C


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2007
    Messages : 62
    Par défaut Python vs Cython vs C
    Salut à tous !
    J'ai testé un petit programme test (somme d'un cos + sin dans une boucle de 1 000 000 d'itérations) en Python, en Cython et enfin en 'C'.
    le résultat est surprenant !
    Quelque soit la fonction (j'ai testé un calcul de suite de Fibonacci), Python 3.13 est plus rapide que Cython ! le C quand à lui écrase tout le monde !
    Avec n itérations = 1 000 000
    fonction testée :

    Somme cython: -0.06
    Durée : 0.209480 sec

    Somme python: -0.06
    Durée : 0.159361 sec

    Somme C : -0.06
    Duree: 0.011000 sec

    Apparemment pas la peine d'essayer de passer par Cython. Python 3.13 fait mieux !
    Bien cordialement.
    Peter

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2007
    Messages : 62
    Par défaut avis
    Personne n'a un avis sur l'utilisation de Cython ?

  3. #3
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 753
    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 753
    Par défaut
    Citation Envoyé par Peter57 Voir le message
    Personne n'a un avis sur l'utilisation de Cython ?
    C'est un outil pour optimiser l'utilisation CPU/mémoire d'un code où on a déjà fait le nécessaire côté algorithme.
    Si vous pensez que ça devrait apporter quelque chose et que le résultat n'est pas là, c'est que vous vous êtes planté quelque part sur la pertinence à utiliser cet outil dans ce cas particulier (et on attends toujours les détails de ce que vous avez fait).

    note: cython ne date pas d'hier et ceux qui l'utilisent à bon escient en sont généralement satisfait.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2007
    Messages : 62
    Par défaut
    voila le programme python -cython
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #
    #   fichier main.py
    #
     
    from pyximport import install ; install()
    import cython_fn
    import time
    import python_fn
     
    #iterations
    n = 1000000
     
    # cal cython version
    t0 = time.time()
    sum_cython = cython_fn.cos_calc(n)
    t1 = time.time()
     
    t = t1-t0
    print(f"Somme cython: {sum_cython:.2f}")
    print(f"Durée : {t:.6f}")
     
    # calc python version
    t0 = time.time()
    sum_python = python_fn.cos_calc(n)
    t1 = time.time()
     
    t = t1-t0
    print(f"Somme python: {sum_python:.2f}")
    print(f"Durée : {t:.6f}")
     
    #
    #   fichier cython_fn.pyx
    #
    # cython : language_Level = 3
     
    import math
     
    def cy_fibo(int n):
        cdef int a,b,i
     
        a , b = 1, 1
     
        for i in range(n):
            a, b = a+b, a
        return a
     
    # version cython
    def cos_calc(int n):
        cdef double s = 0.0
        cdef int i=0
     
        for i in range(n):
            s += (math.cos(i) + math.sin(i))
     
        return s
     
    #
    #   fichier python_fn.py
    #
     
    import math
     
    def cos_calc(n : int):
        s = 0.0
        for i in range(n):
            s += math.cos(i) + math.sin(i)
        return s

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2007
    Messages : 62
    Par défaut version C
    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
     
    // Cython vs Python
    // C version
     
    #include <stdio.h>
    #include <time.h>
    #include <math.h>
     
    double cos_calc(int n) {
    	double s = 0.0;
    	for (int i = 0; i < n; i++) {
    		s += (cos(i) + sin(i));
    	}
    	return s;
    }
     
    int main(){
    	int n = 1000000;
    	double s = 0.0;
     
    	clock_t start = clock();
    	s = cos_calc(n);
    	clock_t end = clock();
     
    	double duration = (double)(end - start) / CLOCKS_PER_SEC;
     
    	printf("Somme: %.2f\n", s);
    	printf("Duree: %.6f secondes\n", duration);
     
    	return 0;
    }

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2007
    Messages : 62
    Par défaut commentaire
    Je concois que la bibliothèque 'Math' de Python 3.13 soit sans doute mieux optimisée que celle de Cython pour le calcul de cos() et sin').
    Mais j'obtiens des résultats similaires avec le calcul d'une suite de Fibonacci avec l'algorithme non recursif.

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 753
    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 753
    Par défaut
    Salut,

    Citation Envoyé par Peter57 Voir le message
    Apparemment pas la peine d'essayer de passer par Cython. Python 3.13 fait mieux !
    Pour sortir ce genre d'affirmation, il faudrait un exemple plus significatif, un code montrant comment ont été obtenus ces résultats permettant de les reproduire au besoin.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 064
    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 064
    Par défaut
    Bonjour,

    Peut-être aussi que vous comparez le temps d'exécution d'un code cpython (python déjà optimisé avec wrapper C) avec votre code cython (code C fait maison).
    Ce temps pourrait être logique, mais pour vérifier, il nous faudra comme dit précédemment par mon VDD, le code !
    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)

  9. #9
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 064
    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 064
    Par défaut
    Hello,


    Pour ce genre de problématique (hors le cas de la suite de Fibonacci qui est un problème itératif), la vectorisation est à mon sens une meilleure solution. Je vous recommande de regarder du côté de numpy.
    Le souci principal vient du fait que votre code Cython n'est pas optimisé. Vous effectuez de nombreux allers-retours entre les types C et les objets Python, ce qui a forcément un coût en performance. La solution est de rester le plus possible dans les types C au sein de votre fonction Cython.
    Pour cela, il faut utiliser les fonctions C de cosinus et sinus directement depuis la librairie mathématique C :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from libc.math cimport cos, sin
    Ensuite, le code Cython peut être encore optimisé à l'aide de décorateurs (ou directives du compilateur) bien choisis qui évitent certaines vérifications de sécurité de Python (coûteuses en temps) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    import cython
     
     
    @cython.boundscheck(False) # Désactive la vérification des bornes (utile si vous accédiez à un tableau)
    @cython.wraparound(False)  # Désactive la gestion de l'indexation négative (ex: liste[-1])
    def cos_calc(int n):
        # ... suite du code

    Même après cette optimisation, le C pur sera probablement toujours un peu plus rapide. C'est normal, il n'y a aucune surcouche liée à l'interpréteur Python.

    Pour conclure, au niveau des performances pour votre fonction cos_calc, numpy reste le meilleur choix. Avec Cython, vous écrivez une boucle for qui, bien que compilée en C, traite les éléments un par un. À l'inverse, numpy transforme cette boucle en une série d'appels à des fonctions C vectorisées, qui sont bien plus performantes pour les calculs sur de grands tableaux de données.
    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. [Python 3.X] Impossible de charger les librairies classiques Python lors de l'éxécution via Cython
    Par -RoCk- dans le forum Interfaçage autre langage
    Réponses: 3
    Dernier message: 10/01/2020, 19h17
  2. Compiler avec cython sous anaconda (distribution python)
    Par wolfman47 dans le forum Général Python
    Réponses: 2
    Dernier message: 19/09/2016, 08h29
  3. python, Cython, C
    Par ZeLaatar dans le forum Interfaçage autre langage
    Réponses: 0
    Dernier message: 10/12/2010, 03h58
  4. CORBA & PYTHON
    Par stan91stan dans le forum CORBA
    Réponses: 5
    Dernier message: 10/06/2004, 12h32

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