11.5.8 : Python



Le langage Python est très différent de tous les langages précédents, car il est dynamiquement typé. Cela signifie que dans un programme Python, le type des données utilisées n'est généralement pas connu par le programmeur, et peut potentiellement ne pas être connu par l'implémentation Python elle-même avant l'exécution. Il est même possible pour un programme Python de modifier son propre code pendant l'exécution.

Cette conception a certains avantages ergonomiques. En effet, si le typage des données joue un rôle crucial dans la vérification d'un programme par le compilateur et dans la production de code optimisé, l'apprentissage d'un système de type représente un effort important pour le programmeur, et l'expression précise des types utilisés par un programme peut être fastidieuse quand ceux-ci sont complexes.

En n'exposant pas les types de données au programmeur, Python peut donc être plus facile à apprendre pour le débutant, et permettre un prototypage d'applications plus rapide pour le programmeur confirmé. En contrepartie, la flexibilité du typage dynamique signifie qu'il est presque impossible de prouver qu'un programme Python est correct pour tous les types de données qu'il peut recevoir en entrée, et elle rend aussi très difficile l'exécution efficace d'un programme Python.

Plus généralement, lorsqu'un choix de conception doit être fait entre performance et facilité d'apprentissage ou ergonomie, le langage Python ne choisit jamais la performance. Les types numériques sont très éloignés des opérations machines natives, la gestion mémoire utilisée est inflexible et très peu performante, il est quasiment impossible d'utiliser le parallélisme en mémoire partagée, et le programmeur ne possède aucun contrôle sur l'organisation des données en mémoire, vis-à-vis de laquelle le langage fait des choix automatiques très peu optimaux.

En revanche, le dynamisme de Python donne aux auteurs de bibliothèques une énorme flexibilité dans les interfaces qu'ils choisissent d'exposer, sans commune mesure avec ce qu'il est possible de faire en C++ par exemple. Le langage est donc souvent utilisé pour construire des interfaces haut-niveau (tels que des notebooks d'analyse interactive accessibles via un navigateur web) vers un calcul implémenté de façon plus efficace dans un autre langage (en C++ par exemple).

Malheureusement, le franchissement de ces interfaces étant très coûteux au niveau machine, elles doivent être conçues de façon à donner une grande quantité de travail à faire au code sous-jacent à chaque fois qu'il est appelé. Ce surcoût, ainsi que la difficulté intrinsèque de faire communiquer deux langages de programmation aux logiques très différentes, rend très difficile la mise au point d'interfaces entre Python et des langages plus optimaux pour le calcul.

Aujourd'hui, le Python est très largement utilisé pour l'enseignement du calcul scientifique, car il est facile à apprendre. Hélas, comme on a pu le voir, cette simplicité n'est obtenue qu'au prix d'une très mauvaise efficacité d'exécution, qui ne permet l'écriture de calculs performants qu'au prix de l'utilisation de systèmes à deux langages dont l'implémentation et l'optimisation est extrêmement complexe.

Ce type de système à deux langages, combinant une interface Python ("pour physiciens") et un cœur de calcul C++ ("pour informaticiens"), est néanmoins la solution standard aujourd'hui à l'IN2P3 pour les outils ayant besoin d'être à la fois bien optimisés et accessibles aux physiciens, comme les environnements d'analyse.

Python est généralement interprété noteLors de l'exécution, le programme est lu par un traducteur qui des opérations machines précompilées en fonction de son contenu. Ce processus évite de passer par un processus de compilation, mais ses performances d'exécution sont très mauvaises., mais il existe également des compilateurs pour des sous-ensembles de Python (Cython, Pythran, Numba, etc) qui permettent d'accélérer l'exécution de certains types de codes.