Quelle stack techno. ? Des "distributions" de Python ?

Python est téléchargeable depuis www.python.org et depuis les différents gestionnaires de paquets des distributions GNU/Linux.

En fonction du système d'exploitation et de la manière dont on a la possibilité de l'administrer, l'installation et le maintien à jour d'un environnement Python performant peut devenir laborieux.

Distributions

Il peut aussi être conseillé d'utiliser des distributions Python adaptées à un environnement scientifique : ces distributions offrent un grand nombre de bibliothèques (par défaut la majorité de celles vues aujourd'hui).

Anaconda

https://www.anaconda.com/distribution/

C'est probablement la distribution la plus répandue.

Elle s'appuie sur l'outil de virtualisation d'environnement conda et est fournie avec environ 200 bibliothèques pré-installées et de nombreuses autres pré-compilés sont disponibles en téléchargement (-> plus simples à installer pour les utilisateurs Windows qu'en utilisant pip avec une installation traditionnelle de Python).

Contrairement aux distributions suivantes, elle n'est pas fournie avec un IDE desktop mais on pourra l'utiliser avec la majorité des IDE Python traditionnels : https://docs.anaconda.com/anaconda/user-guide/tasks/integration/#using-ides.

WinPython

https://winpython.github.io/

Distribution spécifique Windows (7/8/10) qui comprend un grand nombre des bibliothèques vues aujourd'hui (NumPy, SciPy, Matplotlib, pandas, etc.), l'IDE Spyder et Jupyter.

Cette distribution (entièrement portable si besoin) est également fournie avec un compilateur (permettant par exemple de compiler et d'éxecuter du code Cython directement depuis Spyder ou Jupyter, ou d'installer des dépendances qui nécessitent de compiler du code externe).

Autres distributions conseillées / déjà testées :

  • Enthought Canopy : Distribution scientifique complète avec un IDE, Jupyter, Matplotlib, NumPy and SciPy (avec les derniers drivers Intel MKL), Matplotlib, etc. et plus de 600 packages pré-compilés pour une installation facile et rapide.

  • Python(x,y) : Distribution scientifique avec Spyder, Qt, MinGW, etc.

  • PythonAnywhere : IDE Python en ligne et service d'hébergement en ligne (inclus l'ensemble de la stack SciPy)

Des bibliothèques installées en s'appuyant sur des bibliothèques de bas niveau qui offrent de hautes performances pour l'algèbre linéaire

NumPy et SciPy peuvent s'appuyer sur des bibliothèques de plus bas niveau pour certaines opérations (utilisation de l'API BLAS qui utilise certaines fonctionnalités des processeurs telles que l'utilisation d'instructions SIMD).

Sans rentrer dans les détails, on notera que différentes implémentations existent (OpenBLAS, Intel® Math Kernel Library, ATLAS, etc.) et que toutes n'offrent pas les mêmes performances.

Il est possible de savoir quelle configuration est utilisée par NumPy :

In [7]:
import numpy as np

np.__config__.show()
blas_mkl_info:
  NOT AVAILABLE
blis_info:
  NOT AVAILABLE
openblas_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/local/lib']
    language = c
    define_macros = [('HAVE_CBLAS', None)]
blas_opt_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/local/lib']
    language = c
    define_macros = [('HAVE_CBLAS', None)]
lapack_mkl_info:
  NOT AVAILABLE
openblas_lapack_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/local/lib']
    language = c
    define_macros = [('HAVE_CBLAS', None)]
lapack_opt_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/local/lib']
    language = c
    define_macros = [('HAVE_CBLAS', None)]
In [8]:
from numpy.distutils.system_info import get_info
import sys

print("version: %s\nmaxint:  %i\n" % (np.__version__, sys.maxsize))

info = get_info('blas_opt')
print('BLAS info:')
for kk, vv in info.items():
    print(' * ' + kk + ' ' + str(vv))
version: 1.16.2
maxint:  9223372036854775807

BLAS info:
 * libraries ['openblas', 'openblas']
 * library_dirs ['/usr/lib/x86_64-linux-gnu']
 * language c
 * define_macros [('HAVE_CBLAS', None)]
In [9]:
%load_ext rpy2.ipython
%R sessionInfo()
The rpy2.ipython extension is already loaded. To reload it, use:
  %reload_ext rpy2.ipython
Out[9]:
ListVector with 9 elements.
R.version ListVector with 14 elements.
platform StrVector with 1 elements.
'x86_64-pc-linux-gnu'
arch StrVector with 1 elements.
'x86_64'
os StrVector with 1 elements.
'linux-gnu'
... ...
language StrVector with 1 elements.
'R'
version.string StrVector with 1 elements.
'R version 3.4.4 (2018-03-15)'
nickname StrVector with 1 elements.
'Someone to Lean On'
platform StrVector with 1 elements.
'x86_64-pc-linux-gnu (64-bit)'
locale StrVector with 1 elements.
'LC_CTYPE=fr_FR.UTF-8;LC_NUMERIC=C;LC_TIME=fr_FR....
... ...
matprod StrVector with 1 elements.
'default'
BLAS StrVector with 1 elements.
'/usr/lib/x86_64-linux-gnu/openblas/libblas.so.3'
LAPACK StrVector with 1 elements.
'/usr/lib/x86_64-linux-gnu/openblas/liblapack.so.3'

Le choix d'un IDE

  • Spyder

IDE scientifique basé sur Qt. Il intègre une console IPython et prend en charge l'affichage des graphiques matplotlib (notamment) directement dans la console.
L'éditeur de code à proprement parlé n'est pas le plus flexible ni le plus configurable qui existe.

  • PyCharm

IDE professionnel dont il existe une version community.
Interface plutôt jolie mais peut-être plus effrayante à l'usage pour les débutants.
Intègre de nombreux outils liés à la gestion d'un projet en Python.

  • Sublime Text, Ninja-IDE, plugin PyDev pour Eclispe, etc.
  • Jupyter Notebook (anciennement IPython notebook)

C'est un intepréteur interactif basé sur IPython mais permettant d'utiliser des noyaux d'une centaines de langages.
Basé sur le concept des notebooks (calepins électroniques), il permet de combiner des sections en langage naturel, des sections de codes informatiques et différents autres types de médias (graphiques statiques ou interactifs, images, vidéos, etc.).

Il permet d'exporter ces notebooks sous différentes formes : HTML, PDF, scripts Python, slides reveal.js, etc.

  • Jupyter Lab

Récemment arrivé, Jupyter Lab étend les fonctionnalités des notebooks Jupyter en offrant un véritable environnement de travail (bien que toujours basé sur un naviguateur web) avec une interface plus flexible.

En plus de la manipulation de notebooks on peut, comme dans un IDE classique, travailler sur plusieurs fichiers de code source (et avoir une console associée), tout en bénéficiant des nombreux langages supportés par Jupyter.

On peut ainsi réellement éxécuter du code R et Python dans deux onglets voisins, dans un même environnement de travail.