URL: https://linuxfr.org/users/serge_ss_paille/journaux/pythran-0-7-pydataparis Title: Pythran 0.7 - PyDataParis Authors: serge_sans_paille Date: 2015年04月21日T08:38:35+02:00 License: CC By-SA Tags: pythran, python, numpy et fortran Score: 25 Termi' Nal (humour du 42ème degré), Pythran compilateur open source dédié au Python scientifique, a sorti sa version 0.7 il y a peu, à l'occasion du premier événement PyData organisé en France: [PyData Paris](http://pydataparis.joinux.org/). ±6 mois s'étaient écoulés depuis la dernière sortie de ce compilateur dont vous pouvez suivre les aventures trépidantes à travers le [tag pythran](https://linuxfr.org/tags/pythran/public). * [Site du projet](http://pythonhosted.org/pythran) * [Sur GitHub](https://github.com/serge-sans-paille/pythran) * [Sur Pypi](https://pypi.python.org/pypi/pythran) * [Présentation à Pydata](https://www.youtube.com/watch?v=Af8B30mXZ7E) en franglais # Nouveautés # * Meilleur support de Numpy, plus de fonctions, et une meilleur implémentations pour certaines d'entre elles. * Meilleur support de l'indicage étendu, y compris les aberrations du genre a[-1:1:2,:,3][4] * Effort sur l'interface utilisateur (messages d'erreurs lors des échecs de compilation ou d'installation) * Support du stockage FORTRAN style et pas seulement C style pour les tableaux en entrée de Pythran * Analyse (succincte, mais quand même) de la plage de valeur prise par certaines variables pour faire sauter certains tests # Communauté # La grosses surprise de cette version, c'est d'avoir reçu de nombreuses contributions extérieures non francophones. Principalement des rapports de bugs (on va pas dire des rapports de vermine, ce ne serait pas poli). Support archlinux, retours sur l'indicage, les expressions masque et leurs performances, le support de linalg... C'est vraiment super motivant. Imaginez qu'actuellement du code compilé par Pythran tourne sur un petit robot autonome sous-marin en mer du nord ! C'est la folie ! La franchouillarde société [Numscale](http://www.numscale.com/) non contente de nous fournir un moteur de Ferarri avec la lib C++ [NT2](https://github.com/NumScale/nt2), met aussi des heures de dev pour un portage sous Windows, ce qui améliore la portabilité du code généré, mais demande des, disons, *ajustements* pour palier au support partiel de C++11 par VS20XY. D'ailleurs mon alter ego Pierrick Brunet, qui s'est déchiré pour cette release, cherche du boulot. Contactez le ! # Cas concret # Jetez un coup d'œil à ce sympathique code source tiré de [stackoverflow](http://stackoverflow.com/questions/26823312/numba-or-cython-acceleration-in-reaction-diffusion-algorithm) : ```python import numpy as np def GrayScott(counts, Du, Dv, F, k): n = 300 U = np.zeros((n+2,n+2), dtype=np.float32) V = np.zeros((n+2,n+2), dtype=np.float32) u, v = U[1:-1,1:-1], V[1:-1,1:-1] r = 20 u[:] = 1.0 U[n/2-r:n/2+r,n/2-r:n/2+r] = 0.50 V[n/2-r:n/2+r,n/2-r:n/2+r] = 0.25 u += 0.15*np.random.random((n,n)) v += 0.15*np.random.random((n,n)) for i in range(counts): Lu = ( U[0:-2,1:-1] + U[1:-1,0:-2] - 4*U[1:-1,1:-1] + U[1:-1,2:] + U[2: ,1:-1] ) Lv = ( V[0:-2,1:-1] + V[1:-1,0:-2] - 4*V[1:-1,1:-1] + V[1:-1,2:] + V[2: ,1:-1] ) uvv = u*v*v u += Du*Lu - uvv + F*(1 - u) v += Dv*Lv + uvv - (F + k)*v return V ``` Il compile désormais avec Pythran en ajoutant l'annotation ```python #pythran export GrayScott(int, float, float, float, float) ``` et c'est une grande victoire, car il représente bien ce qu'on peut trouver comme type de code Python/numpy : * des appels de fonction externe ``numpy.random.random`` * de l'indicage étendu à gogo ``u, v = U[1:-1,1:-1], V[1:-1,1:-1]`` et même composé avec ``u[:] = 1.0`` * une boucle externe explicite qui entoure des boucles implicites (cf. les calculs de ``Lu`` et ``Lv``) Donc arriver à compiler ça sans demander à l'utilisateur d'expliciter les calculs comme il faudrait le faire en [Cython](http://cython.org/), c'est chouette ! Les perfs sont d'ailleurs au rendez vous ! ```shell $ python -m timeit -s 'from grayscott import GrayScott' 'GrayScott(40, 0.16, 0.08, 0.04, 0.06)' 10 loops, best of 3: 52.9 msec per loop $ cython grayscott.pyx $ gcc grayscott.c `python-config --cflags --libs` -shared -fPIC -o grayscott.so -O3 -march=native $ python -m timeit -s 'from grayscott import GrayScott' 'GrayScott(40, 0.16, 0.08, 0.04, 0.06)' 10 loops, best of 3: 36.4 msec per loop $ pythran grayscott.py -O3 -march=native $ python -m timeit -s 'from grayscott import GrayScott' 'GrayScott(40, 0.16, 0.08, 0.04, 0.06)' 10 loops, best of 3: 20.3 msec per loop ``` # La suite # Au prochain opus, forcément, avec certainement le support de ``numpy.linalg`` et ``numpy.random`` ! Pythran — C++ for snakes