Partageons nos méthodes/langages/librairies pour faire du calcul scientifique ! N’hésitez pas à modifier directement ce message.
Python
Python est un langage de référence tant dans la communauté scientifique que dans l’industrie. C’est un language de haut niveau, donc ça permet d’aller très vite notamment sur les étapes peu intéressantes : lire un csv, envoyer une requête sur le réseau, exporter des résultats…
Toutes les structures de données courantes sont disponibles nativement (list pour les tableaux, dict pour les hash tables, set pour les ensembles, counter, dequeue, …).
Par contre, python est assez lent et gourmand en mémoire. D’expérience, un même algorithme recodé en C sera un ordre de grandeur plus rapide.
Autre défaut, étant un langage interprété, la plupart des erreur ne se signalent qu’à l’exécution. C’est donc rarement une bonne idée de lancer de longs calculs sans avoir précédemment testé le code sur un exemple. Pour se prémunir de ce problème il est possible de prototyper avec jupyter ou d’utiliser un linter (j’ai une préférence pour la 1ère option).
L’implémentation de python la plus courante, cpython, ne gère pas le multithreading, il faut faire du multiprocessing à la place.
Python2 ou python3 ? La plupart des librairies sont maintenant compatibles python3. Personnellement je ne vois plus trop d’avantages à rester sur python2 (au moins pour du calcul scientifique).
Comme pour toute utilisation de python, il est vraiment préférable d’utiliser des virtualenv. virtualenvwrapper permet de les utiliser sans peine.
Beaucoup de librairies existent pour le calcul scientifique :
- scikit-learn : beaucoup d’algorithmes de machine learning standards
- matplotlib : pour faire des graphiques
- numpy : calcul matriciel
- pandas : (basé sur numpy) très utile pour traiter les données en entrée
- theano : (basé sur numpy) calcul symbolique sur des tenseurs, gère la dérivation symbolique, intègre beaucoup d’optimisations, permet de faire tourner des algos sur GPU…
- keras : (basé sur theano) deep learning (jamais utilisé mais conseillé par un copain)
- caffe : deep learning aussi. modelzoo permet d’utiliser des modèles déjà entrainés.
R
C’est un incontournable qui mérite une place de premier plan! C’est l’équivalent Open Source de Matlab (qui est propriétaire; R apporte une comptabilité partielle avec les fichiers Matlab), il est extrêmement bien outillé (R Studio par exemple est phénoménal, Shiny est très intéressant aussi).
C
Le C est plus rapide que python à exécuter mais plus lent à coder. La librairie Cython permet d’avoir le meilleur des deux mondes en interfaçant du code C et du code python. Par exemple, sur un algorithme de descente de gradient, généralement >99% du temps de calcul est passé sur le calcul du gradient. Il est avantageux de coder la fonction de calcul du gradient en C, éventuellement avec du multithreading, et le reste en python.
Matlab / Scilab
Excellent pour prototyper rapidement. Très utilisé par le monde académique, Matlab dispose d’un bon choix de librairies de machine learning (vlfeat par exemple).
Matlab est payant et il est possible de rajouter des « toolbox » (librairies éditées par matworks, payantes aussi). Je crois que c’est raisonnable à l’exception de la toolbox pour faire du calcul distribué.
Matlab peut être remplacé par Scilab.
Sagemath
il y a également une bibliothèque dédiée aux mathématiques qui permet d’unifier plusieurs librairies pour Python existantes:
CodeTyphon
Open source, multi-plateformes, cross-compilation.
Bases de données
Je stocke des tables avec postgresql et des listes avec mongodb. pgadmin3 et robomongo permettent de s’en tirer sur des choses simples sans rien connaître au langage. psycopg2 et pymongo permettent d’interfacer avec python.
NB : robomongo est un outil extraordinaire mais qui n’arrive pas toujours à suivre les évolutions de mongodb. Il faut parfois utiliser une version de mongodb vieille de quelques mois.
Editeurs
- Jupyter : très utilisé (à juste raison) par le monde scientifique. Permet de prototyper du code julia, python ou R. Seul défaut : je n’ai pas trouvé de manière efficace de traquer un notebook avec git.
- Atom : un éditeur multilangage agréable et très facile à customiser. En particulier, il est possible d’ajouter un linter ou un REPL.
Conclusion
Les outils suivants se complètent bien à mon avis :
- Jupyter pour le prototypage + Atom pour le code définitif
- python3 + numpy + pandas pour le tout venant
- C avec cython pour les parties critiques
- scikit-learn pour les algos classiques