Pré-compilation de scripts Python

2010-06-06
Thomas Martin


L'interpréteur Python dispose d'une fonctionnalité permettant de mettre en cache la phase de compilation d'un fichier source. Cela se traduit par la création de fichiers avec l'extension .pyc, placés au même niveau que les fichiers .py correspondant. Ceux-ci contiennent alors le bytecode résultant de la compilation. Cela permet d'améliorer la vitesse de chargement d'un module lors de sa prochaine invocation (mais non sa vitesse d'exécution).

Par défaut, Python effectue automatiquement cette opération pour les fichiers sources composant un module lors de son chargement. Il est nécessaire que le répertoire contenant les fichiers soit accessible en écriture par l'utilisateur invoquant Python, afin de pouvoir écrire les fichiers .pyc. Cela n'est pas forcément le cas pour les modules fournis par une distribution Linux par exemple, qui vont être installés dans une arborescence système, comme /usr/lib. Ou alors dans le cas d'une application web, où le serveur web n'a pas accès en écriture aux fichiers sources.

Afin de contourner cette limitation, il est possible de pre-créer les fichiers .pyc sans même exécuter le code correspondant. Cela nécessite d'utiliser le module compileall. Voici un exemple d'utilisation pour pré-compiler tous les fichiers du répertoire mymodule :

python -m compileall ./mymodule

A noter qu'il est possible d'obtenir un niveau d'optimisation supplémentaire en invoquant Python avec l'option -o. Les fichiers compilés auront alors l'extention .pyo.