Cython Boost de Vitesse vs Convivialité
Je viens de Cython, alors que j'étais à la recherche de moyens pour optimiser le code Python. J'ai lu plusieurs posts sur stackoverflow, le python wiki et lire l'article "les Règles Générales pour l'Optimisation".
Cython est quelque chose qui saisit mon intérêt le plus; 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.
Ici est un idiot test, 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)
$ l'heure python test.custode
real 0m16.774s
user 0m16.745s
sys 0m0.024s
$ temps cython test.custode
real 0m0.513s
user 0m0.196s
sys 0m0.052s
Maintenant, honnêtement, je suis abasourdi. Le code que j'ai utilisé ici est pur code python, et tout ce que j'ai changé, c'est l'interprète. Dans ce cas, si cython est-ce une bonne, alors pourquoi les gens utilisent encore le traditionnel de l'interpréteur Python? Existe-il des problèmes de fiabilité pour Cython?
- Vous êtes en mesure de l'exécution d'un script Python vs le moment de la compilation de certains Cython code. Cela n'a pas de sens.
- Quant à votre dernière remarque: c'est en gros ce que Julia est en train de faire: faire une optimisation de bas niveau code traducteur dans un ensemble cohérent de haut niveau en langage machine, et en montrant clairement cette intention depuis le début, de sorte qu'il est de mieux en mieux la traction, même si cela signifie que certaines haut niveau de fonctionnalités sont perdus dans la manière comme le typage dynamique.
- N'est-ce pas un test de Python interpréter vs Cython copile et de l'exécution? Si cela a du sens.
Vous devez vous connecter pour publier un commentaire.
Les autres réponses ont déjà expliqué comment vous avez été juste de la compilation de la Cython code, de ne pas l'exécuter. Cependant, j'ai pensé que vous pourriez vouloir savoir comment beaucoup plus rapide Cython pouvez rendre votre code. Lorsque j'ai compilé le code que vous avez (bien que j'ai couru à la fonction à partir d'un autre module) avec
distutils
, j'ai très marginal gains de vitesse de plus de droite Python – environ 1%. Cependant, quand j'ai ajouté quelques petits changements dans votre code:et compilé, j'ai eu le temps suivants:
C'est un 100× speed-up. Pas trop mal.
i ** 2
. Le code C débordements pour la majorité des numéros pour lesquels vous effectuez l'opération si vous êtes à la compilation de code 32 bits. (Si on effectue l'opération à tous. Il est concevable que votre compilateur C optimise le fonctionnement tout à fait.) Ce n'est probablement pas une comparaison équitable. Vous aussi vous n'êtes pas tout à fait clair ce que vous êtes en cours d'exécution, la façon dont vous exécutez, et ce que vous êtes quand vous donnez ces moments.Cython est pas un autre interprète. Il génère du c-extensions en python, à partir de python(-like) du code.
cython test.pyx
ne fera que générer un test.c' fichier qui, une fois compilé) peut être utilisé par python comme un normal bibliothèque python.Qui signifie que vous êtes seulement de mesurer le temps qu'il faut pour cython pour traduire votre code python, c pas comment vite que la version de votre code s'exécute.
runcython test.pyx
aura la sémantique que l'OP prévu.cython test.pyx
ne fait pas exécuter votre programme. Lecython
binaire est pour le traitement de votre Cython code en Python module d'extension. Vous devez l'importer en 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 fonctionne quel que soitpython
serait sur la ligne de commande.pyx
fichiers ne devrait probablement pas avoir une ligne shebang, sauf dans le cas de coin, ils sont valables Python programmes.Vous avez un IndentationError dans la posté code.
À l'aide de la traditionnelle interprète est plus simple et plus portable. Cython est fiable, mais a ses limites et ses bizarreries. Il pourrait être intéressante à utiliser des tonnes de plus si la magie a donné les accélérations votre timings de le faire paraître comme il le fait, mais il donne en fait les plus petits. Vous aurez à commencer à utiliser Cython fonctionnalités spécifiques à l'utilisation de C caractéristiques de voir beaucoup de speedup.
Un gros point qui semble être manquant: Cython est pas un sur-ensemble strict de Python. Il ya certaines caractéristiques que Python supporte, mais Cython ne le fait pas. Plus particulièrement, les générateurs et les lambdas (mais ils sont à venir).
La plus grande raison Cython est pas que populaire, c'est qu'il manque autonome (sans python) exécutables.
Manque de publicité. Les développeurs semblent être des universitaires de plus en plus intéressé dans le Développement de leurs logiciels Sage, que la pointe de la langue.
Écueils rencontrés au cours du développement. Un que j'ai rencontré est le manque de vrai support pour les threads. Le tout est enveloppé dans un mondial interprète de verrouillage, rendant des threads, mais la désactivation de la simultanéité!
Pour toute personne qui souhaite que cython effectivement compilé et exécuté votre programme dans une seule ligne, j'ai créé runcython (http://github.com/russell91/runcython).
runcython test.pyx
aura la sémantique que l'OP destinéComme beaucoup de commentaires suggérant le temps que vous avez mentionné avec cython est juste le temps de la conversion .py fichier .c fichier. Qu' .c fichier sera gros du point de vue de la mémoire. L'avantage est que vous pouvez compiler que .c fichier à l'aide du compilateur C aussi
Je vais vous donner un exemple :
si vous avez un fichier python nous avons besoin de magasin .custode de fichier. En exécutant "cython xyz.custode" il va créer .c et .donc les fichiers
Permet de vérifier dans l'image les fichiers créés par cython commande
La taille augmente également dans mon cas, il a changé pour Octets à Ko
Il y a une méthode spécifique pour compiler le code python
vous pouvez consulter ce lien:
http://cython.readthedocs.io/en/latest/src/reference/compilation.html
https://rajeshrinet.github.io/blog/2014/cython/
une autre chose que j'ai remarqué est pas le cas, on évoque les problèmes de mémoire dans cython
Quand j'essaie de le mettre en œuvre dans mon projet intégré.Je suis confronté à beaucoup de problèmes de mémoire.
Vous pouvez essayer de pypy Où il n'est pas nécessaire de mettre des efforts supplémentaires pour compiler et le temps aussi réduit en termes de temps de compilation
Voir le tableau:
comparer le délai entre python et pypy
Je vous remercie..