44 votes

Accélération de Cython et facilité d'utilisation

Je viens de découvrir Cython, alors que je cherchais des moyens d'optimiser le code Python. J'ai lu divers posts sur stackoverflow, le wiki python et j'ai lu l'article "General Rules for Optimization".

Cython est ce qui m'intéresse le plus ; au lieu d'écrire du code C, vous pouvez choisir d'avoir d'autres types de données dans votre code python lui-même.

Voici un test stupide que j'ai essayé,

#!/usr/bin/python
# test.pyx
def test(value):
    for i in xrange(value):
    i**2
    if(i==1000000):
        print i

test(10000001)

$ time python test.pyx

real    0m16.774s 
user    0m16.745s
sys     0m0.024s

$ time cython test.pyx

real    0m0.513s 
user    0m0.196s 
sys     0m0.052s

Maintenant, honnêtement, je suis abasourdi. Le code que j'ai utilisé ici est du pur code python, et tout ce que j'ai changé est l'interpréteur. Dans ce cas, si Cython est si bon, alors pourquoi les gens utilisent-ils encore l'interpréteur Python traditionnel ? Y a-t-il des problèmes de fiabilité pour Cython ?

57voto

Justin Peel Points 17348

Les autres réponses ont déjà expliqué que vous ne faisiez que compiler le code Cython, sans l'exécuter. Cependant, j'ai pensé que vous voudriez savoir à quel point Cython peut rendre votre code plus rapide. Lorsque j'ai compilé le code que vous avez (bien que j'ai exécuté la fonction à partir d'un module différent) avec distutils J'ai obtenu des gains de vitesse très marginaux sur le Python droit - environ 1%. Cependant, lorsque j'ai ajouté quelques petits changements à votre code :

def test(long long value):
    cdef long long i
    cdef long long z
    for i in xrange(value):
        z = i**2
        if(i==1000000):
            print i
        if z < i:
            print "yes"

et l'ai compilé, j'ai obtenu les temps suivants :

  • Du code Python pur : 20,4553578737 secondes
  • Code Cython : 0,199339860234 seconde

C'est une accélération de 100×. Pas trop minable.

18voto

Steven Points 10243

Cython n'est pas un autre interprète. Il génère des extensions c pour python, à partir de code python(-like). cython test.pyx ne générera qu'un fichier 'test.c', qui (une fois compilé) pourra être utilisé par python comme une bibliothèque python normale.

Cela signifie que vous mesurez uniquement le temps nécessaire à cython pour traduire votre code python en c, et non la vitesse d'exécution de cette version de votre code.

10voto

Mike Graham Points 22480
  • cython test.pyx n'exécute pas réellement votre programme. Le site cython binary sert à transformer votre code Cython en un module d'extension Python. Vous devrez l'importer dans Python pour l'exécuter.

  • #!/usr/bin/python n'est pas la meilleure ligne shebang pour les scripts Python. #!/usr/bin/env python est généralement préféré, qui exécute tout python sur la ligne de commande.

    • Cython pyx ne devraient probablement pas avoir de ligne shebang du tout, sauf dans le cas particulier où ce sont des programmes Python valides.
  • Vous avez une IndentationError dans le code affiché.

  • L'utilisation de l'interpréteur traditionnel est plus simple et plus portable. Cython est fiable, mais a ses limites et ses bizarreries. Il pourrait être attrayant de l'utiliser beaucoup plus s'il donnait magiquement les gains de vitesse que vos timings font croire qu'il donne, mais il en donne en fait de plus petits. Vous devrez commencer à utiliser des fonctionnalités spécifiques à Cython pour utiliser des fonctionnalités C afin d'obtenir des gains de vitesse importants.

9voto

carl Points 25879

Un point important qui semble avoir été oublié : Cython n'est pas un sur-ensemble strict de Python. Il y a certaines fonctionnalités que Python supporte, mais pas Cython. En particulier, les générateurs et les lambdas (mais ils sont à venir).

3voto

unixman83 Points 2669
  • La principale raison pour laquelle Cython n'est pas si populaire est qu'il manque d'exécutables autonomes (sans python).

  • Manque de publicité. Les développeurs semblent être des universitaires plus intéressés par le développement de leur logiciel Sage que par un langage de pointe.

  • Pièges rencontrés au cours du développement. L'un d'entre eux est l'absence d'un véritable support des threads. Tout est enveloppé dans un verrou global de l'interpréteur, ce qui le rend threadsafe, mais désactive la concurrence !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X