web-dev-qa-db-fra.com

Augmentation de la vitesse de Cython vs convivialité

Je suis juste tombé sur Cython, alors que je cherchais des moyens d'optimiser le code Python. J'ai lu divers articles sur stackoverflow, le wiki python et lu l'article "General Rules for Optimization".

Cython est quelque chose qui saisit le plus mon intérêt; au lieu d'écrire du code C pour vous-même, 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 code python pur, et tout ce que j'ai changé est l'interpréteur. Dans ce cas, si le cython est si bon, alors pourquoi les gens utilisent-ils toujours l'interpréteur traditionnel Python? Y a-t-il des problèmes de fiabilité pour Cython?

42
user277465

Les autres réponses ont déjà expliqué comment vous compiliez simplement le code Cython, sans l'exécuter. Cependant, j'ai pensé que vous pourriez vouloir savoir à quel point Cython peut rendre votre code plus rapide. Quand j'ai compilé le code que vous avez (bien que j'aie exécuté la fonction à partir d'un module différent) avec distutils , j'ai obtenu des gains de vitesse très marginaux par rapport à la ligne droite Python - environ 1%. Cependant, lorsque j'ai ajouté quelques petites modifications à 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 compilé, j'ai eu les temps suivants:

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

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

53
Justin Peel

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é) peut être utilisé par python comme une bibliothèque python normale).

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

18
Steven
  • cython test.pyx n'exécute pas réellement votre programme. Le binaire cython sert à traiter votre code Cython dans un module d'extension Python. Vous devez 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 s'exécute comme python le ferait sur la ligne de commande.

    • Les fichiers Cython pyx ne devraient probablement pas avoir de ligne Shebang du tout, sauf que dans le cas du coin, ils sont valides Python programmes.
  • Vous avez une IndentationError dans le code publié.

  • L'utilisation de l'interpréteur traditionnel est plus simple et plus portable. Cython est fiable, mais a ses limites et ses caprices. Il pourrait être intéressant de l'utiliser beaucoup plus s'il donnait comme par magie les accélérations que vos synchronisations lui donnent, mais il en donne en fait de plus petites. Vous devrez commencer à utiliser des fonctionnalités spécifiques à Cython pour utiliser les fonctionnalités C pour voir beaucoup d'accélération.

9
Mike Graham

Un gros point qui semble manquer: Cython n'est pas un sur-ensemble strict de Python. Il existe certaines fonctionnalités que Python prend en charge, mais pas Cython. Notamment, les générateurs et les lambdas (mais ils arrivent).

9
carl
  • La plus grande 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 qu'un langage de pointe.

  • Pièges rencontrés lors du développement. Un que j'ai rencontré est le manque de véritable support de thread. Tout est enveloppé dans un verrou d'interprète global, ce qui le rend sûr pour les threads, mais désactive la concurrence!

2
unixman83

Pour tous ceux qui souhaitent que cython compile et exécute votre programme sur une seule ligne, j'ai créé runcython ( http://github.com/russell91/runcython ). runcython test.pyx aura la sémantique voulue par le PO

2
RussellStewart