UKOnline

Exécution de code Python

Le premier élément sur lequel il est possible d'agir pour minimiser le temps d'exécution d'un programme ou sa consommation mémoire consiste à utiliser le meilleur interpréteur Python possible pour votre machine. En effet, le code source d'un programme Python n'est pas directement exécuté par votre machine physique, comme illustré par la figure 1 où on va du code source au code machine.

Exécution de code Python
Un code source Python (.py) est généralement d'abord compilé en un fichier intermédiaire (.pyc) qui est ensuite interprété sur la machine cible.

Interpréteur

Un code source Python est tout d'abord compilé en une forme intermédiaire, appelée bytecode, sauvegardée dans un fichier .pyc que l'on peut retrouver dans le dossier __pycache__. Le principal but de cette étape est d'éviter de ré-analyser le code source à chaque fois que vous allez exécuter le même programme, sans l'avoir modifié.

Voici une simple fonction qui affiche une phrase sur la sortie standard :

À l'aide du module dis, on peut obtenir une forme lisible du bytecode correspondant à cette fonction. Ce bytecode est simplement constituée d'une séquence d'instructions à exécuter :

  2           0 LOAD_GLOBAL              0 (print)
              2 LOAD_CONST               1 ('Hello World!')
              4 CALL_FUNCTION            1
              6 POP_TOP
              8 LOAD_CONST               0 (None)
             10 RETURN_VALUE

Notez bien qu'il ne s'agit pas du tout d'une version optimisée, ni plus rapide, du code source, mais bien d'une forme compilée intermédiaire qui sera ensuite plus facile à exécuter pour l'interpréteur Python.

Si vous exécutez cette fonction hello avec l'interpréteur CPython (CPython est l'interpréteur qui vient par défaut lorsque vous installez Python depuis le site web officiel. Il s'agit d'une implémentation en C et en Python du langage de programmation Python), les six instructions bytecode montrées ci-dessus seront exécutées par ce dernier. Il s'agit de la seconde étape de la figure 1, où le bytecode est interprété, c'est-à-dire transformé à la volée en code machine selon l'ordinateur sur lequel le code est exécuté.

Pour être plus précis, le bytecode est en fait exécuté sur une machine virtuelle Python qui, elle-même, tourne sur votre machine physique. Et c'est justement sur cet élément que l'on peut jouer pour améliorer les performances de l'exécution, c'est-à-dire en choisissant une machine virtuelle qui optimise l'exécution du bytecode.

Implémentation de Python

Plusieurs autres implémentations que CPython, l'implémentation officielle écrite et maintenue par la Python Software Foundation, existent pour le langage de programmation Python. La figure 2 reprend quelques-unes de ces implémentations alternatives. La plus connue est Pypy, une implémentation écrite en RPython qui a pour but d'être optimisée pour la vitesse d'exécution et la consommation mémoire.

Nom Dernière version Langage Version
CPython 3.8.5 (20 juillet 2020) C, Python 3.8.5
PyPy 7.3.1 (10 avril 2020) RPython 3.6.9
Jython 2.7.2 (21 mars 2020) Java, Python 2.7
IronPython 2.7.10 (27 avril 2020) C# 2.7
Stackless Python 3.7.4-slp (4 aout 2019) C, Python 3.7.4
Brython 3.8.10 (29 aout 2020) JavaScript 3
Plusieurs implémentations du langage Python existent, soit pour optimiser les performances d'exécution, soit pour faciliter les interactions avec un autre langage.

D'autres implémentations ont pour but de faciliter l'intégration de Python dans un écosystème existant. Par exemple, Jython permet d'utiliser la librairie standard Java en Python, puisqu'il exécute des programmes Python dans la machine virtuelle Java. IronPython fait pareil, mais pour l'environnement .NET de Microsoft. Ces deux dernières implémentations ne supportent malheureusement que la version 2 du langage Python, dépréciée. On peut également utiliser Python comme langage de script client pour des pages web à l'aide de Brython.