Le langage de programmation Python est clair, explicite et expressif. Il est mature, encourage au bricolage, et dispose d'une logithèque extrêmement vaste. Bref, tout ce qu'il faut pour plaire à un scientifique. Etonnement, il existe des gens qui font de la programmation, et dont ce n'est pas le métier, ni même la passion. Ces gens ont des besoins métiers de plus en plus complexe, et les possibilités croissantes de l'informatique leur permettent de gérer encore plus de complexité. La course à la puissance infinie peut commencer!
Python a une approche touche à tout, il permet de tester et de voir rapidement ce que l'on fait. Sa documentation embarquée, l'introspection et sa console permettent de bidouiller et d'apprendre rapidement. Pour les scientifiques, c'est cette partie-là qui est la plus importante. Tout démarre depuis une console, et pas mal d'itérations plus tard, on peut commencer à écrire des bibliothèques de codes, qui seront utilisés depuis une console. La console de python est bien pratique, mais un peu légère pour y passer ses journées. Pour ça, il faut passer à quelque chose de plus costaud : IPython . Notez les deux majuscules, et le I comme interactif.
Console
IPython propose une console similaire à celle de Python (exécution, documentation...) avec une complétion efficace qui permet même l'introspection des objets ou les chemins du filesystem. La stack des erreurs est plus lisible, avec un extrait du contexte de l'erreur. Grâce à Readline, il est possible de naviguer dans l'historique, et d'utiliser des raccourcis à la Emacs (comme dans bash, quoi). Bref, du confort et de l'assistance sans le côté global et intrusif d'un gros IDE.
Des commandes magiques, commençant par %, permettent de lancer des commandes dans le cadre de IPython (et plus seulement Python). Parmi celles-ci, il y a %run qui permet de charger et d'exécuter un fichier python. %timeit qui permet d'exécuter plusieurs fois une fonction, et de chronométrer la moyenne des 3 meilleurs scores parmi 10 lancés. %prun permet profiler une fonction, avec les statistiques d'utilisations, ligne par ligne.
Les commandes préfixées par ! seront elles, directement exécutés dans le shell, et il est possible de stocker le résultat dans une variable python : a = !ls
ou le contraire, utiliser une variable python dans le shell : !cat $a
.
La courbe d'apprentissage d'IPython est douce, et quand on commence à être blasé, il est possible de rajouter des plugins ou de faire des configurations complexes.
Il existe différentes consoles, celle par défaut se lance dans un terminal, mais il existe aussi une version basée sur Qt, et surtout une version web, le célèbre Notebook. Les consoles évoluées sont capables d'afficher des graphiques interactifs (ceux de matplotlib), voir même des éléments d'interfaces, comme des tirettes pour paramétrer une courbe.
Mais ne vous méprenez pas, IPython n'est pas qu'une jolie console, il sait faire beaucoup plus de choses, et il est le port d'attache de toute la communauté Python pour la science.
Notebook
Notebook a débuté comme une simple console IPython en HTML, dynamique. La page web communique avec le serveur via une websocket, lui confie des commandes, et affiche le résultat. Il est possible d'enregistrer un notebook, et de l'exporter, pour qu'une autre personne puisse le rejouer et le modifier. Il est possible d'insérer différents types de cellules dans un Notebook, en plus du code et de son résultat. Des titres (5 niveaux possibles), et plus intéressant: du markdown, dans lequel on peut utiliser la syntaxe de LaTeX pour écrire des formules mathématiques. Pour éviter des surprises en jouant un notebook douteux, il est possible de le signer. Un Notebook peut être converti dans différents formats, via le format ReST et le logiciel Sphinx. Il est possible de produire un document LaTeX (pour faire un PDF ou l'imprimer), ou un site web statique, par exemple.
Travailler sur un notebook est une expérience orthogonale aux bonnes pratiques du codeur. C'est normal, on ne code pas. L'éditeur fétiche rempli de raccourcis clavier, la gestion de version, les tests unitaires, tout ça, il faut l'oublier un instant. Le notebook est là pour explorer, débroussailler, démontrer. Par contre, rien n'empêche les allers-retours, une fois la recherche et le tuning terminés, on peut retourner dans le code, et écrire (ou copier/coller) des choses qui marchent, et reprendre ses bonnes habitudes de codeur.
Un des avantages pragmatiques du notebook est qu'il peut être installé sur une machine dédiée, choyée, protégée, puis utilisé depuis une machine en vrac, avec juste un browser récent et un clavier qui fonctionne.
Le principe du Notebook a tellement plus qu'il est maintenant possible d'en utiliser en Ruby ou en Julia (un concurrent de python pour les calculs).
Parralel
Un des drames de la vie de python est le GIL , le verrou global qui lui interdit de travailler sur plus d'un CPU. C'est dommage, la moindre machine décente en a au moins 8 à disposition, et Python est coincé sur un seul. La bibliothèque standard de python essaye bien de proposer des choses. Les threads sont possibles, mais juste pour pouvoir attendre quelque chose, le GIL garantit qu'une seule action à la fois est permise. multiprocessing , propose d'exposer une API similaire à celle des threads, mais sur des process. Concrètement, c'est extrêmement pénible à utiliser, et tout simplement une calamité à déboguer. Tout ça pour un bénéfice souvent maigrichon.
La question est plus large, en fait. Faire bosser plusieurs processeurs n'est pas très compliqué. Le souci est de les faire communiquer entre eux de manière efficace, de partager les ressources sans se marcher sur les pieds, et de gérer les erreurs sans devenir fou. De toute façon, cette question-là appartient au passé, parler d'une seule machine, à l'ère du Cloud et du big data peut paraitre incongru. Pas tant que ça, en fait. Le besoin en puissance fonctionne par palier, il est toujours légitime de bien utiliser une machine avant de vouloir en utiliser plusieurs.
IPython propose une approche simple et pragmatique pour mettre à disposition des workers (un par CPU et par machine), dans lesquels une application pourra piocher. L'allocation peut être statique (on choisit son worker) ou dynamique, via un ordonnanceur. IPython utilise par défaut zmq pour faire communiquer les workers mais il est aussi capable d'utiliser MPI : le protocole de passage de messages utilisé dans les gros clusters de calculs (à mémoire partagée ou distribuée). IPython permet aussi de stocker les taches à faire pour pouvoir les relancer en cas d'incidents. L'effort d'IPython est réel, mais ils semblent avoir mis beaucoup d'énergie pour gérer les parcs hétérogènes ou les bibliothèques non installés. Il faudra se tourner vers des bibliothèques tierces (qui pourront utiliser Parralel), pour avoir des outils utilisables et éprouvés. Notebook permet d'utiliser simplement les workers d'IPython. Une partie du travail de parallélisation est en fait confié à Numpy qui lui utilise des bibliothèques éprouvées en C, C++ et Fortran.
IPython (tout comme Python), est un peu court, pour la partie massivement parallèle, faces aux caïds du moment, Scala et même Go , mais son impressionnante bibliothèque disponible, comme la suite SciKit, font de lui un outil d'exploration difficilement contournable. IPython est un produit tout à fait vivant qui entraine tout un écosystème innovant et tonique. Son réel et rafraichissant chalengeur est Julia . Langage non compilé, mais typé, non objet, basé sur LLVM et le just in time, il est clairement orienté vers le calcul scientifique et propose des passerelles vers Python. Il partage les mêmes couches basses que Numpy et propose même une compatilibité avec Notebook.
Ses amis
IPython est utilisé dans la plupart des cas avec Numpy , pour effectuer des calculs de manières efficaces, et Matplotlib , pour dessiner des courbes. D'autres outils deviennent de plus en plus incontournables, comme Scipy (d'autres types de calculs) et Pandas (analyses de données). La suite Scikit (calcul métier) est quand à elle, incontournable. Des outils pour optimiser les calculs ou pour gérer les workers sont aussi disponibles, bref, de quoi écrire d'autres billets.