Articles : Numpy, extension C-Python pour le calcul scientifique
Posté par Nicolas (). Modéré le 14 novembre 2006.
Après 18 mois de gestation, je suis heureux de vous annoncer la naissance du petit numpy qui bientôt deviendra grand.
Numpy est la nouvelle extension C-Python pour faire du calcul scientifique et de l'analyse de données. Cette extension a été développée par un grand nombre de personnes de la communauté Python mais il faut remercier Travis Oliphant qui a eu le courage d'être le principal acteur et le maître d'oeuvre de ce travail qui a rassemblé la communauté scientifique utilisant Python.
La suite dans l'article...
Numpy est la nouvelle extension C-Python pour faire du calcul scientifique et de l'analyse de données. Cette extension a été développée par un grand nombre de personnes de la communauté Python mais il faut remercier Travis Oliphant qui a eu le courage d'être le principal acteur et le maître d'oeuvre de ce travail qui a rassemblé la communauté scientifique utilisant Python.
La suite dans l'article...
numpy (696 hits)
scipy (182 hits)
numarray (110 hits)
matplotlib (158 hits)
> Lire la dépêche (61 commentaires, moyenne: 2,4).
Vous avez demandé le commentaire #775253.




benchs/ tests
Je traine assez souvent avec des gens qui font du calcul scientifique, et le truc qui revient (je trouve), c'est:
* matlab, parcequ'en 2 commandes ça fait presque tout, mais c'est "lent"
* C++/C parceque c'est "rapide", mais il faut une certaine rigueur pour éviter les fuites, éviter les segfault, faire une bonne gestion d'erreur,...
Forcément, si on prend 2 programmes du même niveau de programmation (les chercheurs ne sont pas tous de bons codeurs), un truc en python va être loin derrière le C++ niveau perf. Maintenant, est-ce qu'en utilisant NumPy on rattrape ça ? J'aurais bien aimé avoir un tableau avec des chiffres pour me faire une idée... Quelqu'un a déjà vu ça ?
[^]Re: benchs/ tests
J'utilise Python pour le calcul numérique depuis pas très longtemps, mais pour les perfs, il n'y a vraiment aucun souci par rapport à Matlab.
Par contre, dire que Matlab, c'est lent par rapport à du C/C++, c'est un peu poussé je trouve. En écrivant correctement le code Matlab, tu peux presque tout vectoriser donc ça quand même très vite. Par contre, si tu as beaucoup de conditions ou de tests de variables, ça peu vite chuter.
L'avantage de python par rapport à Matlab, c'est qu'on a un fonctionnement par référence, ce qui évite les copies inutiles des objets. Au début, c'est un peu déroutant, parce que quand on écrit:
b = a[:,1]
b est juste une référence à une partie de a, donc en modifiant b, on modifie a, mais l'avantage c'est qu'on évite de dupliquer inutilement des données, ce qui peut parfois être très rentable en temps de calcul.
Evidemment, on peut copier explicitement un objet.
Un gros avantage de Python est aussi que l'on peut écrire du code propre et réutilisable plus facilement qu'avec Matlab (à mon avis). En plus, on peut documenter son code proprement avec epydoc.
[^]Re: benchs/ tests
>Un gros avantage de Python est aussi que l'on peut écrire du code propre et >réutilisable plus facilement qu'avec Matlab (à mon avis). En plus, on peut >documenter son code proprement avec epydoc.
Un autre gros avantage, je pense, c'est la possibilité d'utiliser un tas de modules sans rapport avec la science, comme par exemple compresser en zip les résultats d'une analyse, puis les envoyer via ftp. Bon ce cas particulier est peut être faisable en matlab ou autre, mais l'idée est là.
[^]Re: benchs/ tests
moi je suis pas du domaine, je rapporte seulement ce que les utilisateurs me disent. Souvent, c'est:
* on code un truc en matlab pour voir si ça marche sur de petites bases de données
* si ça marche, on code le truc en C++ et on laisse mouliner plusieurs jours
J'imagine que ça dépend aussi beaucoup du type de calcul. Si ton truc en matlab prend 1min a s'executer, c'est humain et le passage à quelquechose de plus "rapide" n'est pas forcément justifié. Là il s'agit de plusieurs jours de calculs sur des trucs qui font plusieurs Go. Et il faut pas oublier que les gens en questions ne sont pas des développeurs. S'il faut faire des siouxeries pour que ton matlab il trace, je doute que ça soit fait... En tout cas, je doute que python tel quel soit utilisable dans les cas que je connais...
[^]Re: benchs/ tests
Effectivement, pour ce genre d'application, on peut dire Matlab/Scilab/Scipy/etc ne sont pas forcément très adaptés.
Je crois qu'un grand sage a dit: " Il ne faut pas utiliser un marteau pilon pour enfoncer un clou, ni un pèse-personne pour peser un éléphant " (ou alors c'est de moi...)
[^]Re: benchs/ tests
ouai, enfin tu avouera quand même que ce genre de remarque ne fait pas avancer la chose... Ma question était là pour avoir une idée de la distance entre ce qu'on peut attendre de ce module python et d'un truc en C++.
[^]Re: benchs/ tests
Excuse-moi je ne voulais pas être désagréable.
En fait je pense que l'avantage avec python c'est qu'on peut faire la transition de manière assez douce.
Je m'explique:
Python s'interface assez facilement avec des librairies écrites en C/C++/Fortran, par conséquent on peut toujours écrire les parties "critiques" du code dans un langage performant et utiliser python pour faire l'import export de données, etc. On bénéficie alors des avantages des deux approches.
Je te conseille le livre "python scripting for computational science" qui permet de bien comprendre l'intérêt d'utiliser python pour le calcul scientifique. On peut le trouver en PDF sur internet.
Maintenant, pour ce qui est des performances de ce module python en particulier, ça doit dépendre énormément des algorithmes utilisés dans l'application. En effet, il n'y a a priori pas de différence entre un code écrit en C effectuant une multiplication de matrices et un code Python qui appelle une librairie écrite en C pour faire la multiplication des matrices (enfin je crois!).
[^]Re: benchs/ tests
Salut
As-tu l'URL ? Car moi tout ce que je trouve c'est comment l'acheter. Scholar me trouve un pdf et un ps, mais les liens sont cassés O:-)
Merci
[^]Re: benchs/ tests
Tu peut le trouver là :
http://mdolab.utias.utoronto.ca/resources/python/Python_Scri(...)
[^]Re: benchs/ tests
Que dieu soit en location !
Merci beaucoup :-)
[^]Re: benchs/ tests
d'ou l'avantage de pouvoir ecrire ton soft de calcul bourrin en fortran (qui est toujours pour le moment la reference du calcul scientifique) et de l'interfacer de facon super simple avec numpy et ton programme python. Le meme systeme doit d'ailleurs etre faisable en C aussi mais comme je m'en sers pas je ne sais pas :) .
[^]Re: benchs/ tests
Ici j'utilise Octave (plus les toolboxes de traitement de l'image dans octave-forge)
compilé en 64 bits pour adresser plus de 2go.
Pour la vitesse, j'essaye d'abord de bien vectoriser le code, et s'il ya encore un problème, j'ecris le code gourmand en c/C++ puis je fais appel à cette fonction dans le script octave. Ca semble efficace...
C'est curieux ce que tu ecris sur le fonctionnement par réfénce. Pourquoi n'est pas ce pas utilisé dans matlab par ex?
[^]Re: benchs/ tests
Ici j'utilise Octave (plus les toolboxes de traitement de l'image dans octave-forge)
compilé en 64 bits pour adresser plus de 2go.
Pour la vitesse, j'essaye d'abord de bien vectoriser le code, et s'il ya encore un problème, j'ecris le code gourmand en c/C++ puis je fais appel à cette fonction dans le script octave. Ca semble efficace...
C'est curieux ce que tu ecris sur le fonctionnement par réfénce. Pourquoi n'est pas ce pas utilisé dans matlab par ex?
[^]Re: benchs/ tests
Pour le fonctionnement par référence ou par copie, il me semble que c'est essentiellement une question de génération. En fait, pratiquement tous les langages récents fonctionnent par référence, tandis que les langages plus anciens utilisent la copie. D'autres langages utilisent un peu les deux (les pointeurs en C permettent de faire la même chose).
Je pense que ça n'est pas utilisé dans matlab parce que ça change vraiment beaucoup la façon d'écrire les programmes, et puis aussi parce que personne n'en parle.
Dans le même ordre d'idée, matlab devient de plus en plus limité par le fait qu'il est fait pour une programmation procédurale. Il est par conséquent assez difficile de faire des programmes vraiment réutilisables, pourtant, la syntaxe ne change pas...
[^]Re: benchs/ tests
Matlab c'est lent pour la simple est bonne raison que ce bousin n'est pas multi thread.
Donc meme sur un quadri opteron dual core, ça tourne sur un seule proc :/ Je suis preneur de solution si il y en a...
Dans le labo ou je suis, j'ai vu Matlab tourner pendant 2 semaines d'affilé avant de fournir un résultat !!
Au prix ou c'est vendu, ya de l'abus.
Pour remplacer Matlab, il y a Octave.
http://www.gnu.org/software/octave/
[^]Re: benchs/ tests
Je confirme, Matlab est vraiment très lent...
J'ai testé sous Windows l'an dernier pour des cours, et rien que l'éditeur de texte lague sur mon portable @800MHz (en mode économie d'énergie sur batterie).
En plus je trouve ça inadmissible qu'un logiciel si cher prenne 70Mo de mémoire au démarrage, et plus de 100 après 2-3 petites multiplications de matrices 512x512...
Sans oublier la politique de licences éducations pourrie...
Heureusement dans mon école c'est Scilab only maintenant.
Enfin je n'ai pas encore testé Scilab.
Quelqu'un sait si les boucles sont aussi lentes que sous Matlab ? Parce que le langage est interprété très très lentement avec Matlab...
Pour en revenir à Python je pense que ça peut vraiment être plus performant que Matlab, su fait que le langage est beaucoup plus rapide, et du fait de la richesse des bibliothèques autour. Pour en avoir parlé avec un thésard, le gros plus est de pouvoir écrire tout ce qui est périphérique de façon très simple, et de prototyper très vite.
[^]Re: benchs/ tests
Scilab et Matlab c'est équivalent au niveau des performances et de l'utilisation mémoire. D'ailleurs, pour les 70 Mo ben je sais pas comment tu as eu ces chiffres mais pour moi ça serait plutôt 10Mo.
Pour les boucles, c'est toujours aussi lent car le code est interprété, et c'est le même problème sous Octave, Scilab, Python, etc.
Pour optimiser les performances, il faut écrire les opérations sous forme matricielle au maximum. C'est une gymnastique un peu difficile au début, mais ça fini par devenir un réflexe.
En gros, il ne faut pas écrire:
for i = 1:length(a)
c(i) = a(i)*b(i);
end
Mais plutôt
c = a.*b
Evidemment, cet exemple est trivial. C'est souvent plus compliqué mais ça s'apprend.
[^]Re: benchs/ tests
c'est le meme truc en fortran 90, pas mal de monde ont rale sur les manques de performance du fortran 90 mais ils continuaient(ent) a programmer en fortran 66 avec....
Par contre je mettrai pas le . a pres le a a ta place ;)
[^]Re: benchs/ tests
Par contre je mettrai pas le . a pres le a a ta place ;)
Ben si, il faut mettre le point après le a sinon on fait une multiplcation matricielle qui s'écrirait avec une boucle:
c=0;
for i =1:length(a)
c = c + a(i)*b(i)
end
Voilà!!
[^]Re: benchs/ tests
euh la je suis toujours pas d'accord....a moins que ce soit pas du python dont tu parles...
parceque deja ta boucle c'est;
c=numpy.zeros(len(a))
for i in range(len(a)):
c(i) = a(i)*b(i)
mais si tu fais
c = a.*b
tu vas avoir une jolie erreur de syntaxe!
bon il faut faire attention numpy a un objet matrix du coup si tu fais:
a = numpy.matrix('1 3 4; 5 6 9; 6 4 5')
b = numpy.matrix('1 3 4; 5 6 9; 3 6 7')
numpy.dot(a,b)
a*b
te donne le meme resultat vu que c'est fait pour.
Dans ton cas tu veux:
a = numpy.array([[1, 3, 4],[5, 6, 9],[6, 4, 5]])
b = numpy.array([[1,3,4], [5, 6,9],[3,6,7]])
a*b
Il fuat faire attention car matrix * array fait une multiplication de matrice
Mais je t'assure que le a.*b ca peut pas marcher!
[^]Re: benchs/ tests
uh la je suis toujours pas d'accord....a moins que ce soit pas du python dont tu parles..
Effectivement, on parlait de Scilab/Matlab/Octave.
[^]Re: benchs/ tests
Les 70Mo c'est en regardant dans le gestionnaire de tâches sous Windows XP, avec je ne sais plus quelle version de Matlab (R14 je crois).
Les boucles sont particulièrement lentes sous Matlab, et par rapport à Python c'est très sensible...
De plus tout écrire sous forme de matrice je ne suis pas convaincu par cette approche bien que c'est toujours celle qu'on finit par prendre car plus rapide.
Exemple : la transformée de Fourier, qui est en O(n.log(n)) si on se débrouille bien, si on le fait trivialement avec des matrices ça devient du 0(n²).
L'exemple est mal choisit parce que des fonctions internes de Matlab le font déjà, mais par exemple pour un algo où tu n'as besoin que d'un élément de la matrice, tout calculer est très lourd... Sans compter que par exemple pour un algo je me suis retrouvé avec une matrice 1000*1000 alors qu'une double boucle simple règle le problème.
Ce n'est pas handicapant pour des petites matrices, mais dès que la taille du problème grandit...
Sinon je ne nie pas que Matlab a de très bonnes toolboxes, mais je n'ai pas eut l'occasion de m'en servir.
[^]Re: benchs/ tests
> Les boucles sont particulièrement lentes sous Matlab, et par rapport à Python c'est très sensible...
euh t'es sûr ? t'as un exemple ? parce que depuis la R12 ou la R13 matlab embarque un compilateur JIT et ça commence à dépoter pas mal, certainement beaucoup plus que l'interpreteur python.
[^]Re: benchs/ tests
Je confirme, Matlab est vraiment très lent...
Matlab a des use cases très précis pour lesquels il est extrêmement rapide. Par exemple, tout son calcul matriciel est basé sur atlas, une bibliothèque open source dont les performances sont les meilleures du marché ou presque.
Quand on attaque un problème qui se formule bien avec les opérateurs matriciels et qui ne nécessite pas d'accéder individuellement de façon "aléatoire" au contenu des matrices, un code matlab (ou R ou scilab) est aussi rapide que du C appelant atlas et donc des dizaines fois plus rapide qu'un code C utilise une bibliothèque de calcul matriciel naïve.
Par contre, si on ne sait pas écrire les calculs d'une façon qui plait à matlab (ou si ce n'est pas possible), ça rame. Et c'est normal.
[^]Re: benchs/ tests
Oui ben alors la je vois pas pourquoi ne pas utiliser numpy et python tout deux libres. numpy utilise atlas lorsque celui la est dispo et donc tous les calculs matriciels sont tres rapide. Certes il faut pas utiliser n'importe quel distrib (SUSE n'a pas une lib ATLAS complete donc soit vous la recompiler soit vos calculs vont etre beaucoup plus lent)
[^]Re: benchs/ tests
Mon message n'est pas un argument contre numpy, il cherche juste à préciser les critiques contre matlab pour les rendre pertinentes. Personnellement, je n'utilise pas du tout matlab, mais R qui est libre et qui a les mêmes problèmes que matlab en terme d'efficacité (et les mêmes avantages). Je n'ai pas de doute sur la qualité de numpy en terme de calcul matriciel.