Journal pythran prépare sa mue

Posté par (page perso) . Licence CC by-sa
Tags :
14
30
août
2012

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.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.