python comme langage scientifique

17
HAL Id: hal-00776672 https://hal.inria.fr/hal-00776672 Submitted on 15 Jan 2013 HAL is a multi-disciplinary open access archive for the deposit and dissemination of sci- entific research documents, whether they are pub- lished or not. The documents may come from teaching and research institutions in France or abroad, or from public or private research centers. L’archive ouverte pluridisciplinaire HAL, est destinée au dépôt et à la diffusion de documents scientifiques de niveau recherche, publiés ou non, émanant des établissements d’enseignement et de recherche français ou étrangers, des laboratoires publics ou privés. Python comme langage scientifique Gaël Varoquaux To cite this version: Gaël Varoquaux. Python comme langage scientifique. Linux Magazine, Editions Diamond, 2009, Explorer les richesses du langage Python, 40, <http://www.unixgarden.com/index.php/gnu-linux- magazine-hs/python-comme-langage-scientifique>. <hal-00776672>

Upload: others

Post on 09-Feb-2022

11 views

Category:

Documents


0 download

TRANSCRIPT

HAL Id: hal-00776672https://hal.inria.fr/hal-00776672

Submitted on 15 Jan 2013

HAL is a multi-disciplinary open accessarchive for the deposit and dissemination of sci-entific research documents, whether they are pub-lished or not. The documents may come fromteaching and research institutions in France orabroad, or from public or private research centers.

L’archive ouverte pluridisciplinaire HAL, estdestinée au dépôt et à la diffusion de documentsscientifiques de niveau recherche, publiés ou non,émanant des établissements d’enseignement et derecherche français ou étrangers, des laboratoirespublics ou privés.

Python comme langage scientifiqueGaël Varoquaux

To cite this version:Gaël Varoquaux. Python comme langage scientifique. Linux Magazine, Editions Diamond, 2009,Explorer les richesses du langage Python, 40, <http://www.unixgarden.com/index.php/gnu-linux-magazine-hs/python-comme-langage-scientifique>. <hal-00776672>

Python commelangage

scientifiqueGael Varoquaux

2009-07-13Copyright Gael Varoquaux,License: CC-by-SA

Note

Python dispose de nombreux modules decalcul scientifique permettant d’aborder ef-ficament un probleme scientifique. C’est unlangage tres riche et des outils interactifspermettent de le transformer en un enviro-nement de travail complet et facile d’utili-sation pour l’informatique scientifique.

De nos jours, l’informatique et la simulationnumerique prend une place de plus en plus im-portante dans la recherche scientifique ainsi quele developpement technologique. L’ENIAC, lepremier ordinateur concu, avait pour but lecalcul scientifique, puisqu’il etait utilise pourcalculer des trajectoires d’artillerie. En effet,un ordinateur permet d’automatiser bien destaches, dont les taches de calcul, et d’explorersystematiquement les problemes scientifiques.

De facon generale, un probleme de rechercheet developpement se presente comme un modeleque l’on veut etudier et comprendre. Le mo-dele peut aussi bien etre un modele theoriquequ’un systeme modele fait d’experiences ou unemaquette. Pour developper son intuition, l’idealest de pouvoir interagir le plus possible avec lemodele. Ansi depuis l’antiquite les mathema-ticiens utilisent des dessins et des calculs pourformuler leur hypotheses, mais la generalisationdes ordinateurs il y a vingt ans a conduit a l’ap-parition des mathematiques dites experimen-tales, s’appuyant sur l’utilisation systematiquede l’informatique. Dans l’industrie, par exemplelors de la conception d’un nouveau produit,la simulation numerique permet de tester sys-tematiquement e nombreuses solutions geome-triques ou des materiaux differents de maniere

relativement pratique, plutot que de construirede nombreuses maquettes a grand cout. L’in-formatique scientifique a pour but premier defaciliter cette exploration du probleme. Ses ou-tils, que le scientifique doit apprendre et maıtri-ser, ne sont que des barrieres pour l’utilisateurentre son probleme et lui-meme. Par ailleurs,dans le domaine de la recherche, il est inevi-table que les problemes soient souvent mal po-ses, et changent en permanence au fur et a me-sure que l’on progresse. C’est pourquoi il fautque les solutions utilisees soient aussi souples etagiles que possible.

Pour repondre aux exigences d’interactiviteet de souplesse de developpement, les outilsde l’informatique scientifique se sont eloignesdes langages compiles utilises traditionnelle-ment pour s’orienter vers des environnementsinteractifs specialises dotes de leur propre lan-gage interprete, comme Matlab ou Mathema-tica. Cependant, la limite de ces outils est qu’ilssont specialises. L’un des problemes epineuxque j’ai eu a resoudre plusieurs fois pour montravail de recherche est le controle par ordina-teur d’une experience de physique compliquee,avec de nombreux appareils a commander etsynchroniser, et des donnees a traiter et a affi-cher. J’ai explore beaucoup de solutions. Monexperience a montre que les environnementsscientifiques specialises ne sont pas satisfaisantsdu tout pour la creation d’interface graphiques,la gestion des couches reseaux, ou le controle demateriel scientifique. Les langages generalisteset bas niveau comme le C peuvent se revelerdesastreux dans les labos, car ils forcent l’uti-lisateur a s’occuper de problemes qui ne l’in-teressent pas, comme la gestion de memoire,et ne proposent pas de facon transparente lesoutils standards dont le scientifique a besoinpour faire ses calculs, traiter ses donnees, etvisualiser les resultats. Il y a quelques annees,je me suis jete a l’eau, et j’ai decide d’utiliserPython pour developper une infrastructure decontrole d’experience, malgre les reticences demes collegues qui ne connaissaient pas le lan-gage et ne voulaient pas apprendre un nouveloutil. Le resultat a ete remarquable : non seule-ment j’ai pu rapidement construire l’infrastruc-ture dont j’avais besoin, mais en plus le codeetait propre et facile a etendre [1]. Mes col-

legues m’ont avoue qu’ils preferaient cette solu-tion a celles que nous avions deployees jusqu’ici,car avec celle-ci ils avaient l’impression de com-prendre la base de code.

Depuis cette experience positive, je suisconvaincu que Python n’est pas seulement unlangage que j’apprecie personnellement beau-coup, mais aussi une bonne reponse au pro-bleme recurrent de l’informatique scientifique.La rapidite avec laquelle le langage se re-pand dans les laboratoires de recherche semblele confirmer. Techniquement, Python possedebeaucoup d’atouts qui en font un outil ideal.En effet, c’est un langage tres clair a lire, memepour un non initie comme un scientifique dontle corps de metier n’est pas l’informatique. Deplus, il est possible d’utiliser le langage de fa-con interactive, comme une calculatrice, ce quiest necessaire pour une approche exploratoired’un probleme. Le langage est concu pour fa-ciliter la reutilisation de code et les cycles dedeveloppement courts ; il ne cherche pas a im-poser les techniques de programmation neces-saires a un gros projet, tout en les permettant.Finalement, Python n’est pas un langage spe-cialise, ce qui lui permet de beneficier d’unegrosse masse de developpeurs, et d’excellentesbibliotheques pour les taches non specifique-ment scientifiques, par exemple pour coupler lesresultats d’une experience a une base de don-nees.

Le potentiel de Python dans un environne-ment scientifique a ete percu depuis longtemps.Des le milieu des annees 90, des pionniers de-veloppaient des modules de calcul scientifique.Ces dernieres annees ont cependant vu l’utilisa-tion scientifique de Python s’accelerer grande-ment et de nombreux modules scientifiques sontmaintenant disponibles. Dans cet article, j’ai-merais prendre le temps de presenter les outilsmajeurs de l’informatique scientifique en Py-thon, ainsi qu’illustrer leur utilisation.

Calcul vectoriel avec numpy

Tableaux et matrices

Controler une experience d’op-tique atomique

J’ai fait ma these en physique atomique. J’ai tra-vaille sur plusieurs grosses experiences qui me-langent une quantite effroyable d’equipement. Lecoeur de l’experience est une chambre sous ultravide dans laquelle on introduit une petite quan-tite d’atomes. On utilise alors une combinaison dechamps magnetiques, d’ondes radio et microondes etde lasers pour manipuler les atomes. Les differentsappareils (certains commerciaux, d’autres maisons)sont synchronises a l’aide d’un ordinateur, qui s’oc-cupe aussi d’acquerir des donnees par l’intermediaired’oscilloscopes et de cameras. Les donnees sont trai-tees en temps reel et affichees pour que l’operateurpuisse ajuster l’experience. De plus nous program-mons souvent l’experience en sequences pendant les-quelles des parametres sont varies automatiquementpendant des heures, si possible sans intervention hu-maine. Au cours de ces prises de donnees, tous lesparametres et les resultats experimentaux sont sto-ckes pour etre analyses plus tard.Bien que le logiciel de controle soit un logiciel scien-tifique, avec une partie de traitement de donnees,les problemes contre lesquels je me suis le plusheurte sont des problemes d’interface graphique, deflux de donnees, de communication asynchrone surdifferents bus, ou d’appel direct au materiel. J’aipu constater que la polyvalence de Python est unatout majeur pour ce genre de travail [1]. Il estnettement plus agreable d’implementer un serveurTCP/IP pour parler a un systeme de controle em-barque en Python qu’en MatLab. Malheureusementune grande partie du code controlant les experiencessur lesquelles j’ai travaille etait en MatLab.

Le fer de lance des applications scientifiquesen Python est le module numpy qui introduitdeux nouveaux types de donnees : tableaux etmatrices. Les tableaux numeriques multidimen-sionnels sont un element essentiel d’un langagepour faire du calcul numerique. Fortran est leseul langage non specialise integrant ce type nu-merique et cela explique son succes dans la com-munaute scientifique. En effet, on est souventamene a faire les memes operations numeriquessur un ensemble de nombres. Si on les range

2

dans un tableau numpy, on peut effectuer cesoperations simultanement sur tout l’ensemble..Voici un exemple illustrant comment elever aucarre une serie de nombre avec numpy:

>>> import numpy

>>> a = numpy.array([1, 2, 4, 8, 16])

>>> a**2

array([ 1, 4, 16, 64, 256])

numpy fournit des fonctions mathematiquesde base s’appliquant a ces tableaux, telles quesinus ou exponentielle, mais aussi des fonc-tions pour les manipuler, les redimensionner,les concatener. Ces fonctions sont implementeesdirectement en C, et sont donc tres rapides surde gros tableaux. Une bonne regle a suivre pourfaire du code efficace et lisible avec numpy estde bannir les boucles for et de manipuler untableau comme un tout.

Les tableaux fournis par numpy sont des ob-jets tres riches avec des moyens optimises deles parcourir, dans une direction ou une autre,selon un pas variable ou avec un jeu particu-lier d’indices, ce qui permet d’implementer desfonctions optimisees pour le cache du proces-seur. De plus, il est possible d’extraire une vued’une partie d’un tableau. Cette vue se com-porte comme un tableau a part entiere, maisce n’est pas une copie du tableau d’origine etles modifications qui lui sont faites s’appliquentaussi au tableau parent. L’API C de numpy per-met de controler en detail la structure internedes tableaux, pour, par exemple, la passer a desfonctions implementees en fortran ou en C [2].Toute cette richesse est cependant transparentesous Python, et le code ressemble a une suited’operations mathematiques, ce qui permet auscientifique de se concentrer sur celles-ci, plutotque sur les structures de donnees ou la gestionde la memoire.

Un autre type numerique important pour lesscientifiques est la matrice. numpy definit la no-tion de matrices, qui se comportent comme destableaux, a part que la multiplication de deuxmatrices n’est pas une multiplication elementspar elements, comme pour les tableaux, mais lamultiplication matricielle.

Vectoriser les boucles pour la perfor-mance

Remplacer une boucle for sur une liste par uneoperation sur tableau entraıne un importantgain de performance, mais cela peut aussidemander de reformuler le probleme. C’est cequ’on appel vectoriser le code. Si par exempleon a un tableau numerique bi-dimensionnelI, une image peut-etre, auquel on desire ap-pliquer la transformation suivante: I2[i, j]

= 0.25*(I[i-1, j] + I[i+1, j] + I[i,

j-1] + I[i, j+1]), qui peut etre visualiseainsi:

Image avant et apres application du laplacien.

Cette transformation peut etre utilisee pourajouter du flou a une image, mais de faconplus generale, en termes mathematiques, elleconsiste a prendre le laplacien du tableau. Uneimplementation en Python pur, sans l’utilisa-tion de numpy, peut s’ecrire, pour un tableau I

de taille n x n :

I = [[0 for j in range(n)] for i in range(n)]

I[n/2][n/2] = 1

from copy import deepcopy

I2 = deepcopy(I)

for i in range(1, n-1):

for j in range(1, n-1):

I2[i][j] = (I[i-1][j] + I[i+1][j] +

I[i][j-1] + I[i][j+1])*0.25

Lorsqu’on utilise numpy, l’operation se for-mule a l’aide d’operations globales sur les ta-bleaux, en utilisant de l’indexage par slices

pour creer des vues decalees du tableau I :

3

from numpy import zeros

I = zeros((n, n))

I[n/2, n/2] = 1

I[1:-1, 1:-1] = (I[:-2, 1:-1] + I[2:, 1:-1] +

I[1:-1, :-2] + I[1:-1, 2:])*0.25

Cet exemple illustre bien une des notionscle de numpy : la creation de vues a partird’un tableau par de l’indexage par intervalle,ou slice en termes de Python. La premierechose qui saute aux yeux en comparant les deuximplementations est que l’implementation avecnumpy est plus concise. Pour un regard entraıneau calcul vectoriel, elle est aussi plus claire. Lesoperations vectorielles globales sur un tableausont par ailleurs tres rapide. Mesurons le tempsd’execution de l’operation pour differentes va-leurs de n :

Temps d’execution de la transformation pour

differentes tailles de tableau.

On peut voir que, sur cet exemple tres simple,pour des petits tableaux le temps de creation dutableau numpy surpasse le gain en vitesse sur lesoperations vectorielles. Cependant, des que lestableaux contiennent plus de 100 elements il estplus efficace de passer par numpy, car le tempsd’initialisation du tableau devient negligeable.Lorsque le nombre d’elements croıt, le tempsd’execution en Python pur croıt aussi vite qu’enutilisant numpy, et le gain apporte par numpy sestabilise a un facteur 30.

On a donc tout interet a remplacer lesboucles avec des operations sur un ensembleuniforme de nombres par des manipulations surdes vues d’un tableau numpy. Dans l’exempleci dessus, les vues etaient prises decalees afind’avoir des operations melangeant differentescases d’un tableau. Une autre operation de vec-torisation courante est d’effectuer une opera-tion conditionnelle sur un tableau en utilisant

un masque : on applique la condition au tableaupour creer un tableau de booleens, que l’on uti-lise pour selectionner les indices des cases dutableau sur lesquelles on veut agir, en operantsur une vue de ce tableau extraite par indexage.Ainsi, si on veux remplacer par zero tous lesnombres pairs d’un tableau, la condition s’ecrit(a % 2) == 0, car % retourne le reste de la di-vision entiere en Python, et l’operation sur toutle tableau s’ecrit ainsi:

>>> a = numpy.arange(10)

>>> a

array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

>>> masque = ((a % 2) == 0)

>>> a[masque] = 0

>>> a

array([0, 1, 0, 3, 0, 5, 0, 7, 0, 9])

Notons qu’il n’est pas vraiment necessaire decreer le tableau masque si on ne le reutilise pasen dehors de ce code. L’operation peut se re-duire a a[(a % 2) == 0] = 0.

Un exemple grandeur nature

Interessons nous maintenant a l’implementa-tion d’un probleme concret avec numpy : l’etudede l’ensemble de Mandelbrot. L’ensemble deMandelbrot est une bizarrerie mathematique :un fractal ; c’est non seulement un objet mathe-matique fascinant, mais aussi fort joli. On peuten obtenir une representation considerant unensemble de points complexes c qui forment uncarre dans le plan complexe. On itere la trans-formation z = z**2 + c en prenant z initiale-ment nul et on arrete l’iteration lorsque le mo-dule de z, abs(z), depasse un seuil que nousprendrons a 10. Le tableau qui nous interesseest la carte qui donne l’iteration a partir delaquelle abs(z) franchit le seuil pour les dif-ferentes valeur de c. Une implementation nonvectorisee de cet algorithme consiste juste a letraduire en Python : il faut parcourir la grillede valeurs de c qui nous interessent, et pourchacune de ces valeurs iterer la transformationet noter a partir de quand abs(z) franchit leseuil :

4

Prendre en compte les incerti-tudes dans le calcul numerique

Jayant Sen Gupta, EADS

Une simulation numerique consiste a evaluer unegrandeur a partir d’un jeu de parametres physiquesqui alimente un modele de calcul. Par exemple, lacharge subie par la coiffe d’Ariane 5 peut etre calcu-lee a partir de ses caracteristiques mecaniques et desconditions de vent lors du vol. Or, ces parametressont souvent meconnus ou naturellement aleatoires.Pour faire face au besoin grandissant dans l’indus-trie de prendre en compte les incertitudes dans lasimulation, OpenTURNS, une plateforme libre demodelisation et de propagation d’incertitudes (voirwww.openturns.org) a ete developpee conjointementpar EADS IW, EDF R&D et Phimeca. Cet outil,compose d’une librairie C++ de plus de 300 classes,est utilise sous la forme d’un module Python. L’in-terfacage entre C++ et Python a ete grandementfacilite par l’utilisation de SWIG. L’utilisation dulangage Python permet de manipuler dans un cadreunifie les objets specialises dans la propagation d’in-certitudes (algorithmes de Monte Carlo, lois de pro-babilites multivariees, tests statistiques,...) et les ob-jets plus generaux par une interaction efficace avecd’autres modules, notamment matplotlib et rpy.

from numpy import zeros, linspace

divergence = zeros((500, 500))

for c_x in linspace(-1.5, 0.5, 500):

for c_y in linspace(-1, 1, 500):

c = c_x + c_y*1j

z = 0

for i in range(50):

z = z**2 + c

if (abs(z) > 10):

divergence[(c_x+1.49)*250,

(c_y+0.99)*250] = 50 - i

break

Si on cherche a vectoriser cet algorithme, onpeut noter que les deux boucles for exterieuressont des parcours d’indices d’un tableau, etpeuvent donc se remplacer par des operationsglobales sur le tableau. On peut alors stocker lesvaleurs successives de c_x et c_y dans deux ta-bleaux qui forment une grille comme cree par lafonction numpy ogrid. La boucle interne, elle,est une iteration, et se traduit donc bien par

une boucle. Finalement il nous faut remplacerla condition par un masque et une operationsur tout le tableau.:

from numpy import ogrid, zeros, ones, abs, complex

c_x, c_y = ogrid[-1.5:0.5:500j, -1:1:500j]

c = c_x + c_y * 1j

divergence = zeros((500, 500))

z = zeros((500, 500), complex)

masque = ones((500, 500), dtype=bool)

for i in range(50):

z[masque] = z[masque]**2 + c[masque]

masque = (abs(z) < 10)

divergence -= masque

Cet algorithme se prete mal a la vectori-sation, car le seuil est atteint pour differentevaleur de c au bout d’un nombre d’iterationstres different. Appliquer les memes operationsa l’ensemble du tableau conduit a faire des ite-rations superflues pour certaines cases du ta-bleau. C’est pourquoi on utilise un masque quinous permet de ne pas iterer sur les valeursaillant depasse le seuil. Notons que si nous ite-rions sans le masque, il faudrait faire attentiona la divergence rapide de z: certain nombres nepourraient etre representes par des float et ap-paraıtrons comme des nan apres avoir depassele seuil. Il est alors necessaire d’en tenir comptelors des comparaisons. Par ailleurs, numpy nousevite generalement de nous preoccuper du typedes valeurs d’un tableau (le dtype du tableau)et deduit le type retourne par operation alge-brique de son type d’entree. Cependant, lors-qu’on assigne des valeurs complexes a une vued’un tableau, comme c’est le cas dans la bouclesi-dessus, le type des donnees du tableau condi-tionne celui de la vue sur le tableau. C’est pour-qui, si nous n’avions pas declare le tableau z

explicitement comme complexe, la partie ima-ginaire du calcul serait perdue.

Les temps d’execution de la version non vec-torisee et vectorisee sont 26s et 6.6s. Une ver-sion vectorisee, mais sans masque met 8s as’executer. On peut donc voir que dans ce casmal adapte a la vectorisation, celle ci ne nousfait gagner qu’un facteur 5 en temps d’execu-tion. La vectorisation est un art, et certains al-gorithmes se vectorisent nettement moins bien.Nous verrons qu’il existe d’autres solutions.

5

Trace de courbes avec Mat-PlotLib

Pour explorer efficacement des problemes scien-tifiques, il est indispensable de pouvoir visua-liser ses resultats. Cela fait partie integrantedu processus de developpement. Python excellea ce jeu, car il dispose d’un excellent modulede visualisation 2D, matplotlib [4]. Avoir desmethodes de visualisation integrees au langage,sans faire appel a des outils exterieurs commegnuplot, est un grand gain, car il n’est plusnecessaire de maıtriser un environnement hete-rogene et de traduire les types de donnees. Deplus, la visualisation et le traitement de donneessont deux problemes difficilement separables.matplotlib propose une interface appelee

pylab qui s’inspire fortement des fonctions d’af-fichage de Matlab. pylab fournit un ensemblede fonctions tres simples permettant d’afficherdes courbes, des images, ou des champs devecteurs a partir des tableaux numpy. Les de-tails fins d’affichage peuvent etre regles gracea l’emploi d’arguments optionnels. L’ensemblede Mandelbrot calcule au paragraphe precedentpeut etre facilement visualise:

>>> from pylab import imshow, cm, show

>>> imshow(divergence, cmap=cm.spectral,

extent=(-1, 1, -1, 1))

>>> show()

L’appel a la fonction show ouvre une fenetreinteractive dans laquelle on peut par examplezoomer sur la figure.

L’ensemble de Mandebrot, visualise avec Mat-

PlotLib

Les figures peuvent etre exportees sous formede fichiers en de nombreux formats raster, maisaussi vectoriels. De plus matplotlib fournit desinterfaces pour les differentes API graphiques(Tk, Wx, Qt, ...). Leur structure interne deest orientee objet et se prete bien a l’inclusiondans un grand programme interactif. L’utilisa-teur peut zoomer sur les graphes, et les objetsgraphiques savent emettre des evenements lors-qu’ils sont selectionnes.

Trace des fonctions de Bessel avec MatPlotLib.

Cette figure montre a quel point MatPlotLib

permet de controler les details fins de l’affi-

chage de courbes mathematiques. En plus des

courbes, il est possible d’afficher des regions

remplies, et du texte. MatPlotLib dispose aussi

d’un moteur de rendu des equations.

Scipy : une bibliotheque d’algo-rithmes

6

Le module scipy fournit une collection d’al-gorithmes numeriques courants utilisant les ta-bleaux et matrices numpy comme types de base.Beaucoup de ces algorithmes utilisent des al-gorithmes disponibles dans les bibliothequesscientifiques standards implementees en C ouen fortran telles que LAPACK, LSODE, MIN-PACK et bien d’autres. En effet, les problemesde bases rencontres en calcul numerique sontsouvent les memes. Malheureusement, les scien-tifiques ont tendance a perpetuellement rein-venter la roue, car les types de donnees utiliseespar les differentes bibliotheques en C ou en for-tran ne sont pas toujours les memes, ou bienparce qu’ils ne maıtrisent pas bien l’utilisationde bibliotheques avec des langages compiles.

Parmi les nombreux algorithmes disponiblesdans scipy on peut entre autre trouver desalgorithmes d’optimisation, qui recherchent leminimum d’une fonction, des methodes d’in-terpolation, des fonctions de traitement du si-gnal, des procedures d’integration numerique,de traitement d’images, de statistiques... La bi-bliotheque est vaste et grandit regulierement.L’interet d’une telle bibliotheque generaliste estde fournir un point d’acces unique aux scienti-fiques pour trouver les outils dont ils ont besoin,mais aussi de permettre de construire des algo-rithmes elabores qui necessitent d’utiliser plu-sieurs classes d’algorithmes standards. scipy arecemment ete complete par un ensemble descikits, des petits modules qui accueillent desalgorithmes donc le code ne peut aller dansscipy, parce qu’il n’est pas assez mur, ou pourdes problemes de licence.

Exemple de recherche du zero d’une fonctionavec scipy:

>>> def f(x):

... return x**3 - x**2 -10

...

>>> from scipy import optimize

>>> optimize.fsolve(f, 1)

2.54451152839

Le travail interactif avec IPy-thon

En recherche, l’angle d’attaque d’un problemeest rarement connu a l’avance. L’algorithmes’affine au fur et a mesure que l’on explore leprobleme. C’est pour cela que un environne-ment interactif pour afficher les donnees, lestraiter, essayer differentes approches, est aucœur de la methodologie scientifique moderne.Le projet IPython fournit cet environnementriche. En plus de la ligne de commande inter-active de Python, IPython dispose de fonction-nalites puissantes d’edition de ligne, comme lacompletion de code, le rappel d’historique, ainsique des possibilites de sauvegarde de sessions,et bien plus.

Je developpe souvent un algorithme en tra-vaillant simultanement sous IPython, ou jeteste et je mets au point chaque etape, ainsi queavec un editeur de fichier, dans lequel j’inscrisl’algorithme pour pouvoir le reutiliser. L’outildont je me sers le plus sous IPython est lacommande %run mon_fichier.py, qui permetd’executer un script Python. Apres l’executiondu script, les variables qu’il a definies sont ac-cessibles dans IPython et je peux les explorer,soit en les affichant directement dans IPython,soit a l’aide de MatPlotLib. Cela me permetd’introspecter facilement l’algorithme.

De plus, si je lance IPython avec la com-mande ipython -pylab, le module pylab estdirectement importe dans IPython pour une vi-sualisation interactive des resultats. En effet, jepeux utiliser les commandes d’affichage four-nies par pylab pour afficher les differents ta-bleaux que je manipule ; elles creent alors desfenetres MatPlotLib qui apparaissent au fur eta mesure que je travail sous la ligne de com-mande IPython, sans la bloquer. Je peux inter-agir avec elles, par exemple en agrandissant lesparties qui m’interessent, tout en continuant atravailler sous IPython ; la commande show deMaPlotLib n’est plus necessaire, l’affichage decourbes et la saisie de commandes dans IPythonpeuvent etre simultanees. La couche graphiquede MatPlotLib tourne alors dans un differentthread que la ligne de commande IPython, maistout ceci est transparent pour l’utilisateur.

7

IPython m’aide aussi a comprendre les er-reurs dans mon code. Lorsqu’une commande,ou un script, execute sous IPython contient uneerreur, IPython affiche en couleur un “traceba-ck”detaillant la pile d’appel au moment de l’er-reur. La commande %debug permet de lancer ledebogueur sur la derniere erreur. L’environne-ment interactif contient alors les variables lo-cales de la fonction dans laquelle c’est produitl’erreur. Je peux utiliser les commandes up etdown pour de naviguer dans la pile d’appels etexplorer les valeurs des differentes variables.

Si je traite des donnees, je suis amene a effec-tuer en plus des operations mathematiques surdes tableaux de la manipulation de fichier. IPy-thon introduit des raccourcis pour des actionscourantes, comme les commandes systemes, quel’on precede alors d’un “ !”, ou rappeler le resul-tats de la n ieme commande, ou encore editer lecode source correspondant a une fonction avecla commande %edit fonction. Par ailleurs, lacommande %timeit m’est tres utile pour me-surer la rapidite d’execution d’une fonction,

afin de guider ses choix d’optimisation. Toutces petits details en font un outil central pourmon travail. Finalement, IPython propose unmode special physique, lance avec la commandeipython -p physics dans lequel la syntaxe dePython est modifiee pour permettre de definirfacilement des grandeurs dimensionnees ; c’estmon outil favori pour faire un calcul au labora-toire:

In [1]: d = 1 m

In [2]: t = 1 s

In [3]: v = d/t

In [4]: v

Out[4]: 1 m/s

Visualisation 3D interactiveavec Mayavi

Si MatPlotLib fournit une excellente reponsepour le trace de courbe en 2D, ce module necherche pas a repondre au probleme de la vi-sualisation de donnees dans l’espace. Le pro-gramme Mayavi, cree a l’origine pour permettreune visualisation facile de resultats de simula-tions de mecanique des fluides, a beaucoup eteutilise pour visualiser des donnees en 3D en lescriptant en Python. Il s’appuie grandement surla bibliotheque de visualisation VTK ecrite enC++, mais est lui-meme ecrit en Python. Uneversion 2 du programme a ete recrite a partirde zero pour lui permettre d’etre aussi utilisecomme une bibliotheque de visualisation 3D ausein de scripts, ou de plus gros projets.

Une des difficultes rencontrees lorsqu’on veutafficher des donnees en 3D est de decrire com-ment les donnees sont agencees et comment onveut les visualiser : est-ce un nuage de points,une surface, un champ de vecteur ? Pour celales donnees sont traditionnellement mises dansun format dedie a VTK, mais Mayavi fournitaussi une interface simplifiee similaire a pylab

qui decrit les donnees par des tableaux numpy.Elle peut etre utilisee dans IPython pour affi-cher les donnees en 3D alors que l’on travailleinteractivement.

8

Les objets affiches en 3D sont souvent com-pliques, et il est important de pouvoir interagiravec eux, par exemple en changeant l’angle devue, ou en affichant des coupes. Mayavi permetde modifier tous les parametres de la visualisa-tion, soit par des boites de dialogues, soit parson API orientee objet. Par ailleurs, l’applica-tion permet a l’utilisateur avance d’utiliser plei-nement la puissance de VTK, car elle lui exposeun jeux de classes Python qui correspondentaux classes de la bibliotheque C++ VTK. Ilest possible par exemple de rajouter des filtrespour faire du post-traitement des donnees pourla visualisation, comme de la simplification degrille.

Donnees d’IRM du cerveau visualisees avec

Mayavi

Interfaces avec d’autres lan-gages

L’utilisation de Python est un grand gain en ra-pidite de developpement et en facilite de main-tenance du code par rapport aux langages com-piles, comme le C ou le fortran, mais il fautavouer que malgre les optimisations de numpy

Comprendre le cerveau

Les scanneurs IRMs modernes ouvrent la porte a lacomprehension des mecanismes du cerveau. Cepen-dant le cerveau est un objet tres complique et lesdonnees experimentales sortant des scanneurs sontbruitees et difficiles a interpreter. Une partie de larecherche en neuroimagerie contemporaine consistea traiter les sequences d’images tridimensionnellesacquises sur different sujets avec des algorithmesquantitatifs, pour extraire par exemple l’evolutiontemporelle de l’activite neuronale des sujets et lacorreler avec leurs actions lors de l’acquisition.Les difficultes liees a ce traitement de donnees sontnon seulement les algorithmes qu’il faut developper,mais aussi la visualisation, et finalement l’organisa-tion des donnees. Pour ce dernier probleme, Pythonexcelle, car il permet de definir des objets riches, oude se connecter a des bases de donnees. En effet, ilfaut conserver les informations sur les differents al-gorithmes appliques, l’experience menee sur le sujet,ses mouvements, etc, tout en permettant une ana-lyse systematique sur un ensemble d’experiences etde sujets en faisant varier les differents parametres.Python est deja beaucoup utilise dans la commu-naute de neuroimagerie, et le projet NiPy vise a de-velopper un module coherent reunissant les outilsspecifiques dont les chercheurs ont besoin.

et de scipy, le code compile reste plus rapide.De plus il existe une grande quantite de codesscientifiques ecrit dans ces langages qu’il est im-portant de pouvoir reutiliser. Soyez rassures, ilest tres facile de meler fortran, C et Python,c’est meme l’une des grandes forces de Pythonpar rapport a d’autres langages scientifiques dehaut niveau comme Matlab ou Mathematica,qui n’ont des interfaces rudimentaires avec leslangages compiles.

Inclure du C avec weave

Tout d’abord, il est possible d’inclure des boutsde code C++ directement dans le code Py-thon sous forme de chaıne de caracteres en uti-lisant le module scipy.weave. Celui-ci compile

9

le bout de code lorsqu’il est appele pour la pre-miere fois et s’occupe de faire le passage d’ar-guments de Python au C++. On peut donc re-crire le code etudie plus haut pour prendre lelaplacien d’un tableau :

from numpy import zeros_like

from scipy import weave

def laplace(I):

I2 = zeros_like(I)

nx, ny = I.shape

weave.inline("""

for (int i=1 ; i<nx-1 ; ++i) {

for (int j=1 ; j<ny-1 ; ++j) {

I2(i, j) = (I(i-1, j) +

I(i+1, j) +

I(i, j-1) +

I(i, j+1))*0.25 ;

} }""",

[’I’, ’I2’, ’nx’, ’ny’],

type_converters=weave.converters.blitz)

return I2

Grace aux “blitz converters”, les tableaux I

et I2 sont passes sous forme d’un objet blitzI(i, j) au code C++, qui permet d’acceder aleurs elements et de les modifier. Le code C++modifie donc le tableau I2 et, comme il s’agit dela meme plage memoire en C++ et en Python,celui-ci est aussi modifie dans la couche Python.

Une bonne regle a suivre lorsqu’on melangedu code C et du code Python, et de laisser Py-thon faire la gestion memoire. Ainsi au lieu decreer un tableau en C, on peut en passer envide, cree en Python, comme je l’ai fait pourI2 dans l’exemple si-dessus. Ainsi on a pas a sepreoccuper d’allouer ou de liberer la memoire,Python s’en charge.

cython

Le projet le plus ambitieux et le plus promet-teur pour ce qui est de melanger langages com-piles et Python, c’est a dire un langage dyna-mique, est Cython. Ce projet, qui descend duprojet Pyrex, introduit un nouveau langage quiressemble comme deux gouttes d’eau a Python,mais permet des specifier des informations sup-plementaires, comme des declarations de type.

Le code Cython est transforme en du code C,qui est compile en langage machine, mais quiforme une bibliotheque liee a la machine vir-tuelle Python. La machine virtuelle Python estutilisee pour executer les parties typees dyna-miquement, qui ne s’executerons pas plus viteque du code Python normal ; cependant les ope-rations pour lesquels cython peut determinerles types de toutes les variables seront aussi ra-pides que du code C normal. L’exemple du la-placien peut etre aussi ecrit en Cython. Commedans la plus part des cas, transformer le codePython en code Cython consiste simplement arajouter les informations de types:

cimport numpy

cimport cython

@cython.boundscheck(False)

def blur_cython(numpy.ndarray[double, ndim=2] I):

cdef numpy.ndarray[double, ndim=2] I2

I2 = I.copy()

cdef int i, j

for i in range(1, I.shape[0]-1):

for j in range(1, I.shape[1]-1):

I2[i, j] = (I[i-1, j] + I[i+1, j] +

I[i, j-1] + I[i, j+1])*0.25

return I2

Pour pouvoir executer cet exemple, il me fautle compiler. Pour cela, le plus simple est de creerun fichier setup.py contenant:

from distutils.core import setup

from distutils.extension import Extension

from Cython.Distutils import build_ext

ext_modules=[Extension("exemple", ["exemple.pyx"])]

setup( cmdclass = {’build_ext’: build_ext},

ext_modules = ext_modules)

que l’on execute en appelant python

setup.py build_ext --inplace.Le support des tableaux multidimensionnels

dans Cython a ete implemente cet ete, graceau support de Google et Enthought. Le decora-teur boundscheck peut etre utiliser pour indi-quer a Cython de ne pas verifier les bornes destableaux, lors de leur indexage. Le code resul-tant est plus rapide, mais cours aussi le risque

10

de segfaulter. Une erreur courante avec Cythonest d’oublier de declarer le type d’une variable,comme par exemple une variable peut impor-tante, i ou j dans notre exemple. Le code fonc-tionne alors sans erreur, mais la variable esttypee dynamiquement, et ralentie grandementl’execution. Malgre ces limitations, je prefereecrire du code cython a du code C car la syn-taxe est plus proche de Python et je benefi-cie des objets Python, que je peux utiliser enpayant un cout en performance.

Cython est un projet tres dynamique etcherche au maximum la facilite d’utilisation.Ainsi lorsqu’une erreur se produit pendantl’execution d’une librairie cython, Python ge-nere des “tracebacks” qui montrent la pile d’ap-pel dans le code Cython d’origine, tout commelors de l’execution de code Python normal. Fi-nallement, Cython est tres bien documente [7].

Rapidite d’execution

Arme de ces deux nouveaux outils nous pou-vons chiffrer le temps d’execution de notre rou-tine test, le calcul du laplacien d’un tableau.

Temps d’execution du calcul du laplacien pour

differente taille de tableau.

Sur l’exemple du laplacien, pour des grandstableaux, weave ou Cython apportent un gainen vitesse d’execution d’un facteur 2 par rap-port au code numpy, soit un facteur 60 par rap-port au code Python.

Le gain en rapidite d’execution par rapporta du code numpy bien ecrit n’est donc pas fou-droyant, tout du moins sur l’exemple du lapla-cien qui se vectorise tres bien. L’effort pour pro-

duire et maintenir le code est cependant beau-coup plus important. Il convient donc de limiterau maximum cette utilisation de code compile.La regle a suivre est de chercher d’abord a deve-lopper un algorithme qui marche, en cherchanta bien le comprendre et l’analyser grace auxoutils interactifs comme IPython, MatPlotLibou Mayavi ; une fois satisfait par l’approche ge-nerale il faut d’abord chercher a bien optimi-ser l’algorithme, sa vectorisation, a utiliser desbibliotheques numeriques deja ecrites commescipy, tout en mesurant en continu les gains enperformance (par exemple en utilisant %timeitsous IPython). Je ne considere l’utilisation decode compile que comme un dernier recours, etuniquement aux quelques endroits critiques ausein du projet scientifique. Le but d’un codescientifique n’est generalement pas de tournerle plus vite possible, mais de produire des re-sultats scientifiques.

L’ensemble de Mandelbrot

Le calcul du laplacien se vectorise extremementbien, et il ne semble pas justifiable d’employerdes langages compiles pour ce probleme. Cepen-dant nous avons vu que le calcul de l’ensemblede Mandelbrot se pretait beaucoup moins biena la vectorisation. Regardons la performancedes versions weave et cython. Dans les deux casnous devons utiliser trois boucles for, commedans l’implementation en pur Python, ce quinous permet d’interrompre l’iteration des que leseuil de divergence est atteint, et donc d’eviterles calculs superflus. Il nous faut aussi imple-menter les calculs sur des nombres complexes ala main. En weave les calculs sont simplementles operations sur les elements des tableaux, eton peut s’inspirer de l’implementation pur Py-thon pour la traduire en C :

from numpy import zeros

from scipy import weave

divergence = zeros((500, 500))

weave.inline(r"""

float x, y, x_buffer, c_x, c_y ;

for (c_x=-1.5 ; c_x<0.5 ; c_x=c_x+0.004) {

for (c_y=-1 ; c_y<1 ; c_y=c_y+0.004) {

x = 0 ; y = 0 ;

11

for (int i=0 ; i<50 ; i++) {

x_buffer = x*x - y*y + c_x ;

y = 2*x*y + c_y ;

x = x_buffer ;

if ((x*x + y*y) > 100) {

divergence(

(int) ((c_x+1.5)*250),

(int) ((c_y+1)*250)

) = 50 - i ;

break ;

}

}

}

}""",

[’divergence’],

type_converters=weave.converters.blitz)

Le code etant du code C, il faut bien en-tendu faire attention a la conversion de type,par exemple dans l’indexage des tableaux. Atrop faire du Python on fini par oublier ces de-tails importants du C.

En Cython, le code ressemble fortement aucode Python correspondant, au detail pres qu’ilnous faut effectuer a la main les operations surles nombres complexes:

cimport numpy

from numpy import zeros

cdef numpy.ndarray[double, ndim=2] divergence

divergence = zeros((500, 500))

cdef float x, y, x_buffer, c_x, c_y

cdef int i, j, n

c_x = -1.5

for i in range(500):

c_y = -1

for j in range(500):

c_y += 0.004

x = 0 ; y = 0

for n in range(50):

x_buffer = x*x - y*y + c_x

y = 2*x*y + c_y

x = x_buffer

if (x*x + y*y > 100):

divergence[i, j] = 50 - n

break

c_x += 0.004

Nous pouvons a nouveau nous interesser ala performance de ces implementations. Pourmemoire, l’implementation Python pur prend26s et celle en numpy prend 6.6s. Passer a ducode compile nous permet de gagner encoredeux ordres de grandeurs : l’implementation en

weave prend 64ms, et celle en cython 59ms.On gagne donc beaucoup en vitesse a passera du code compile pour cet exemple, mais en-core faut-il que les besoins scientifiques justi-fient l’exces en complexite pour que cela soitrentable. Je dois avouer que je n’ai presque ja-mais utilise du code compile au sein de moncode Python pour mes projets de recherche,mais de savoir que j’ai cette possibilite si j’aides besoins particuliers de performance me per-met d’utiliser Python sans douter de mon choixde langage.

Reutiliser des librairies fortran ou C

Si l’on a une grande quantite de code a ecrireen C, il peut etre plus pratique de compiler desbibliotheques C. De meme, on peut vouloir uti-liser des bibliotheques C existantes, dont on apas forcement le code source. Le module ctypespermet de charger des bibliotheques C sous Py-thon et de definir la signature des fonctionsqu’elles contiennent pour pouvoir les utiliser defacon transparente a partir de Python. De plusles tableaux numpy savent exposer leur struc-ture interne sous forme d’un tableau C dont onrecupere l’adresse memoire pour la passer auxfonctions de la bibliotheque en C.

Par ailleurs, il existe une grande quantite decode scientifique ecrit en fortran. Il est impor-tant de pouvoir le reutiliser, pour pouvoir ba-tir les efforts de recherche actuels sur des re-sultats passes. Du code fortran peut facilementetre charge dans Python. Pour cela on utilisele script f2py qui sait compiler un programmefortran en un module que l’on importe dansPython de facon transparente. Chaque fonctionen fortran est automatiquement importee, carf2py sait analyser les signatures des fichiers for-tran.

Finallement, si l’on veut interfacer une grosselibrairie C++, par exemple avec des dia-grammes de classes compliques, SWIG est unsysteme puissants d’analyse de code qui sait in-terpreter du C++ pour generer du code Pythonl’appelant. On peut meme specifier toute unelogique de conversion de types et de templatesde C++ vers Python. C’est cependant un outilavance, a l’utilisation plus delicate.

12

Interagir avec d’autres environne-ments scientifiques

Il est important de pouvoir reutiliser le codedeja ecrit dans des langages compiles, mais ilpeut aussi etre important de pouvoir benefi-cier du travail ecrit dans d’autres langages dy-namiques, tel que Matlab. Ainsi, bien que jetrouve le langage de statistiques R nettementmoins agreable que Python, il existe une grandequantite d’algorithmes de statistiques imple-mentes en R. Le module rpy permet ainsi d’ac-ceder aux fonctionnalites du langage R sous Py-thon en appelant directement les fonctions Csous-jacente et en exposant les objets R en Py-thon. Pour pouvoir faire une interface aussi ele-gante, il faut cependant pouvoir appeler l’envi-ronnement que l’on veut reutiliser comme unelibrairies. Malheureusement, tous ne se pretentpas a cela.

Plus generalement on peut utiliser des pipe

pour communiquer avec des processus. Le mo-dule PyMat cree ainsi une instance de MatLab,avec laquelle il communique pour executer ducode Matlab. De meme le module gnuplot per-met de faire de la visualisation avec Gnuplot enlui envoyant les donnees par l’intermediaire dela fonction pipe du module os. Ceci peut etreutile pour reutiliser des scripts Python existant,mais fait perdre bien des avantages de Python,meme en utilisant le module gnuplot. En effet,il y a un fort sur cout en memoire et en tempsd’execution a transferer les variables d’un pro-cessus a l’autre. De plus les structures de don-nees riches et la bonne gestion d’erreur de Py-thon sont perdus. Je n’ai recours a ces solutionsque si un module Python natif ne me permetpas de faire ce dont j’ai besoin, mais, encore unefois, c’est rassurant de savoir qu’elles existent.

Au dela du calcul numerique :NetworkX et Sympy

Tous les problemes scientifiques ne se resumentpas a des manipulations de nombres. Ainsi, engenetique, l’exploration des filiations entre es-peces se fait naturellement en representant les

Concevoir des ailes

Au centre de recherche d’Airbus, a Bristol en Angle-terre, plus de 2000 ingenieurs travaillent a concevoiret tester des ailes d’avion. Une grande partie du tra-vail de conception se fait a l’aide de simulations trescomplexes deployees sur de gros clusters. Le cœurdur numerique de ces simulations sont principale-ment ecrites en C et en fortran mais depuis quelquesannees Airbus utilise Python pour guider les simu-lations.En plus du code qui tourne sur les clusters pendantla simulation, les ingenieurs utilisent une applica-tion interactive developpee en Python pour mieuxcomprendre les resultats d’une simulation et prepa-rer les suivantes. Cette application combine concep-tion et dessin des profils des ailes avec le traitementet visualisation de donnees, utilisant entre autreMayavi2.

donnees sur des arbres, qui ne sont que descas particulier de graphes. Les graphes sontune structure mathematique formee de som-mets connectes entre eux par des arretes. Ilspeuvent servir a decrire les reseaux, souvent deconnectivite complexe, que l’on rencontre enchimie, en etudiant de grandes molecules, eninformatique theorique, en economie, ou encoreen sociologie.

Un graphe des principales villes americaines

avec leur population, et la circulation sur les

autoroutes le reliant, represente a l’aide de Net-

workX et MatPlotLib.

networkX est un module Python optimise

13

pour decrire, representer, et etudier les graphes.Il dispose d’algorithmes standards en theo-rie des graphes, permettant par exemple detrouver la distance la plus courte entre deuxsommets donnes (probleme dit de percolationsur graphe), d’isoler des sous-ensembles nonconnectes, d’etudier les proprietes de trans-port, comme sur un reseau informatique, oules proprietes statistiques du reseau. Je peuxpar exemple utiliser NetworkX pour trouver lemoyen le plus rapide d’aller de Paris a Austin,connaissant les temps de vols entre les differentsaeroports:

In [1]: import networkx as NX

In [2]: G = NX.XGraph()

In [3]: G.add_edges_from((

...: (’Paris’, ’Dallas’, 10),

...: (’Dallas’, ’Austin’, 1),

...: (’Paris’, ’NY’, 7),

...: (’NY’, ’Dallas’, 5)))

In [4]: NX.draw_graphviz(G, prog=’fdp’)

In [5]: NX.dijkstra_path(G, ’Paris’, ’Austin’)

Out[5]: [’Paris’, ’Dallas’, ’Austin’]

Le module sympy definit des expressions sym-boliques sous Python. Ces objets permettent ducalcul formel en Python lorsqu’ils sont manipu-les avec les operateurs standards comme l’addi-tion ou la multiplication. De plus sympy fournitun ensemble de fonctions de calcul, comme laderivation, l’integration, ou la recherche de so-lution a des equations. sympy est assez jeune,et ne peut encore etre considere comme un sys-teme de calcul formel complet, cependant il esttres interessant de pouvoir manipuler des ex-pressions symboliques dans un programme oul’on utilise des tableaux numpy pour faire ducalcul numerique. En effet, simplifier une ex-pression, ou la deriver, peut grandement acce-lerer un calcul numerique.

Sage

un environnement pour les mathema-tiques fondamentales

La recherche en mathematiques pures utilise l’infor-matique a la fois pour automatiser les travaux sys-tematiques dans des demonstrations et pour des ex-periences virtuelles avec des objets mathematiques,pour developper l’intuition, et conduire a des conjec-tures qui pourront alors etre demontrees de faconformelle.Pour cela, le chercheur a besoin d’un environnementqui lui permette de manipuler les objets abstraitsmathematiques, de definir et d’appliquer des opera-tions dessus, et de les visualiser. Il existe de nom-breux bibliotheques permettant de faire cela pourdifferents domaines des mathematiques, mais ellesne sont generalement accessibles que par l’interme-diaire d’un langage compile, et ne fournissent pas unenvironnement tres propice a l’exploration. De plusil est difficile de les combiner. Sage est un projet quiutilise Python comme langage pour construire en en-vironnement combinant les differents bibliothequesen un ensemble homogene. Sage peut etre utilise enligne sur http://sagenb.org .

Une session sympy sous ipython. Les variables x,

y et z sont definies dans sympy.interactive.

Des outils integres, une plate-forme non specialisee

J’espere que l’enumeration ci dessus de mo-

14

dules scientifiques disponibles sous Python vousa convaincu que c’est une plate-forme tres richepour le calcul scientifique, meme si je n’ai faitqu’explorer la surface de ce monde. Ses outils,qui sont souvent bases sur des bibliothequesexistantes en langages compiles, forment beau-coup plus qu’un jeux de programmes indepen-dants : ils partagent entre autre le langage, l’in-terpreteur, les types de donnees ou la gestiond’erreur. J’ai utilise par le passe des jeux descripts shell appelant tout sorte de programmesscientifiques, comme Gnuplot ou Octave, ainsique des bouts de codes compiles. Non seulementil faut apprendre un nouveau mini langage pourchaque outil, mais en plus une bonne partie dutemps et de l’energie est gachee a faire parler unprogramme avec un autre. Les modules listesci-dessus sont tous bases sur les memes typesde donnees, car Python fournit des types debase riches, qui sont completes par numpy. Onpeut meler de facon transparente les moduleset esperer construire un programme coherent,par exemple avec une interface graphique, etune bonne gestion d’erreur, des possibilites in-tegrees de deboggage, ou de profiling... De plus,le langage n’est pas un langage specialise au do-maine scientifique, et l’on peut beneficier d’ex-cellents modules developpes par d’autres com-munautes. Ainsi l’un de mes collegues deve-loppe un appareil integre d’analyse spectrosco-pique de l’air qui sera deploye sur le terrain ;il controle son appareil et visualise les donneesa l’aide d’une interface web, developpee avec lemodule de developpement web Django, en com-binaison avec MatPlotLib.

Bien entendu tout n’est pas parfait et l’in-formatique scientifique avec Python souffreaussi de problemes. Tout d’abord on peut no-ter que la qualite de la documentation laissebeaucoup a desirer. La communaute est tresconsciente de ce probleme, et maintenant queles differentes bibliotheques ont muries, un se-rieux effort de documentation est en court :le site http://docs.scipy.org permet non seule-ment d’acceder a la documentation distribueeavec numpy et scipy, mais aussi de l’amelio-rer, a la maniere de WikiPedia. Par ailleursles differentes bibliotheques dependent souventde code numerique difficile a compiler, commeATLAS ou VTK. L’installation peut donc etre

un probleme. Je pense que la solution a ceprobleme peut etre trouvee grace a des distri-butions formees de l’ensemble de binaires deces modules. Ainsi l’Enthought Python Distri-bution (http://www.enthought.com/epd/) estune distribution multi-plate-forme suppor-tee commercialement, tandis que PythonXY(http://pythonxy.com) est une distributionlibre, mais uniquement sous Windows. Sous Li-nux, la proportion des ces modules offerts parles distributions varie, Ubuntu et Debian of-frant la meilleure couverture.

La combinaison d’un langage tres agreable autiliser, d’une communaute dynamique et d’unensemble d’outils scientifiques tres complet faitde Python un environnement ideal pour le tra-vail scientifique qui se detache comme le lan-gage scientifique du futur. Si il y a quelquesannees le langage etait meconnu dans la com-munaute scientifique, je rencontre aujourd’huiun nombre grandissant de collegues ayant fran-chit le pas. Mes collegues d’Airbus m’ont confiequ’ils incitaient les universites a ce que les etu-diants apprennent Python. Et ce n’est qu’undebut ! Le langage est tres jeune pour la com-munaute scientifique et les progres sont en trainde s’emballer en ce moment meme.

Bibliography

[1]G. Varoquaux, Agile Computer Controlof a Complex Experiment. Computingin Science & Engineering, vol 10, p. 55 ;2008

[2]T. Oliphant, Guide to NumPy, Tregol

publishing, 2005

[3]M. Brucher, Python : Les fondamentauxdu langage - La programmation pourles scientifiques, ENI Ressources Infor-matiques, 2008

[4]J. Hunter, D. Dalle, Guide de l’utili-

sateur de matplotlib

15

http://matplotlib.sourceforge.net/

[5]Documentation en ligne de scipy etnumpy http://docs.scipy.org

[6]P. Ramachandran, G. Varoquaux,

Guide de l’utilisateur de Mayavi2

http://code.enthought.com/projects/mayavi

[7] Documentation en ligne de Cythonhttp://docs.cython.org/

[8] Proceedings of the 7th Python in Scienceconference (2008), editors: G.Varoquaux, T. Vaught, J. Millmanhttp://conference.scipy.org/proceedings/SciPy2008/

16