SSS Ss SsSS SSs s [un serpent qui vous salue en morse, c'est pas banal!]
Comme tout animal à sang froid, Pythran a profité de l'été pour s'allonger sur un rocher et emmagasiner de la chaleur. Quand un humain s'adonne à cette activité, ce n'est pas très progressif, mais là ça a plutôt bien marché.
Petit résumé.
Tests Unitaires
Pythran repose sur unittest
pour les tests unitaires. Un test consiste en
1. Une fonction écrite en python ;
2. des paramètres pour cette fonction ;
3. le typage de la fonction (pourrait être déduit de celui des paramètres).
Par exemple
1. def fibo(n): return n if n <2 else fibo(n-1) + fibo(n-2)
2. 7
3. int
À partir de là, le module de test va
1. Charger la fonction python, l'appeler avec les paramètres donnés et sauver la valeur de retour ;
2. Traduire la même fonction en une fonction template C++, l'instancier avec les types fournis, compiler le machin, le charger dynamiquement l'exécuter avec les paramètres donnés et sauver la valeur de retour ;
3. Vérifier que les deux appels ont renvoyé la même valeur.
Cette méthodo est assez robuste et permet de tester le runtime C++ (si dict.update
est mal implémenté en C++, ça va vite se voir). Elle suppose que les fonctions testées sont déterministes, donc faut faire un poil attention aux tris etc. Et elle est assez coûteuse, car g++ a du mal à instancier tous les template rapidement, même si -fno-implicit-inline-templates
aide un p'tit peu.
En plus de ça, quelques code plus gros sont listés dans un coin pour aller plus loin que les tests unitaires. Ceux là sont justes compilés, pas exécutés.
Résultat des courses : plus de 200 tests, mais… une heure pour passer la validation [avec un simple python setup.py test
, grâce à une petite classe maison dans le setup.py
]. Notons à ce propos que unittest
n'exploite pas les différents cœurs de calcul de la machine, même si des concurrents à lui, genre nose le font.
De la doc
Avant, la doc de pythran c'était un peu le « où est Charlie » de l'informatique. C'est toujours pas la grande gloire, mais il y a une courageuse tentative de donner des infos aux éventuels devs et utilisateurs, regroupés ici, mais pas encore publié sous un medium moins… enfin plus… bref. J'aime bien le format ReST, soit-dit en passant.
De la Perf'
La perf, c'est un peu la marque de fabrique locale. C'est à ça qu'on distingue le reptile sur le bord du sentier : il galope (pas banal pour un reptile). Une classe maison, basée sur le très pratique timeit, parcourt les fichiers de test et recherche ceux possédant une annotation du type:
#runas a=[ [ float(1) for i in xrange(200)] for j in xrange(200)] ; matrix_multiply(a,a)
Ce qui permet de les exécuter de nombreuses fois, en ne mesurant que l'appel de fonction. Ceci fait pour python et pythran, je vous laisse apprécier les résultats:
#prog python(s) pythran(s) python/pythran
nqueens 2.83769392967 0.392530918121 7.23
extrema 0.564915895462 0.0818209648132 6.90
matmul 2.07190084457 0.0764870643616 27.09
stone 1.09741306305 0.0154478549957 71.04
quicksort 4.79617810249 0.0729520320892 65.74
pi_buffon 7.92331314087 0.911416053772 8.69
Je n'ai pas les chiffres sous les yeux, mais j'avais en plus lancer ses mêmes tests pour PyPy, shedskin et nuitka, et on s'en sortait bien.
Pour les curieux, les sources sont dans https://github.com/serge-sans-paille/pythran/tree/master/pythran/tests/cases.
Compatibilité Python
Tout code Pythran est un code Python, mais tout code Python n'est pas un code Pythran. Depuis le premier journal, nous avons reçu quelques visiteurs sur Freenode, #pythran, et surtout l'aide de deux étudiants de Télécom Bretagne, Sares et Belem, qui ont permis de booster pas mal le développement! La quasi-totalité de l'interface de list
et dict
est maintenant supportée, celle de set
est presque finie et le support des exceptions est en cours. Les variables globales (au moins en lecture seule) manquent toujours à l'appel…
PyConFr
Youhou, \o/
et \_o<
, Pythran a été accepté à PyconFr. Stress, stress, stress.
Et pour finir, une petite nimage pudique en rapport avec le sujet de ce journal.
# saikoi ?
Posté par GeneralZod . Évalué à 9.
Faudrait mentionner quelque part de manière explicite (comme le recommande judicieusement le Zen Python => python -m this) ce qu'est Pythran … De préférence au début du nourjal.
[^] # Re: saikoi ?
Posté par serge_sans_paille (site web personnel) . Évalué à 2.
Merci de me faire découvrir la PEP20 !
Pour pythran c'est… bien :-)
C'est un convertisseur d'un sous ensemble de python vers du C++. En gros en enlevant les classes utilisateurs et tous les aspects trop dynamiques, on arrive à convertir des codes de calcul en des codes relativement efficace (cf. benchs dans le journal). Le README du projet est, je l'espère, plus explicite ?
[^] # Re: saikoi ?
Posté par lolop (site web personnel) . Évalué à 2.
Le PEP20 en Français
http://intrw.net/log/spip.php?article179
http://hg.afpy.org/afpy_communication/raw-file/7b764dbd2ea4/poster_zen/PythonZen-ab.svg
Votez les 30 juin et 7 juillet, en connaissance de cause. http://www.pointal.net/VotesDeputesRN
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.