Comment un seul indicateur accélère l'exécution de vos scripts
Agence web » Actualités du digital » Comment un seul indicateur accélère l'exécution de vos scripts

Comment un seul indicateur accélère l'exécution de vos scripts

Lorsque vous essayez d'obtenir les meilleures performances de Python, la plupart des développeurs passent immédiatement à des correctifs algorithmiques complexes, en utilisant des extensions C ou en exécutant de manière obsessionnelle des outils de profilage. Cependant, l'un des moyens les plus rapides et les plus négligés d'accélérer instantanément un script Python consiste à utiliser vos indicateurs de ligne de commande.

L'indicateur que nous vérifions est le commutateur qui demande à Python d'effectuer un nettoyage brutal au moment de la compilation, en supprimant tout ce qui n'est pas strictement nécessaire à l'exécution de la logique finale.

L'amélioration secrète des performances cachée à la vue de tous

Si vous exécutez un script à l'aide de la commande python -O script.pyvous activez le mode d'optimisation de base de Python. C'est une fonctionnalité qui manque à beaucoup de développeurs, d'autant plus que beaucoup de gens considèrent les instructions assert comme des aides au débogage inoffensives.

Vous pensez peut-être que ces contrôles attendent d'être déclenchés, mais dans un environnement de production chargé avec un débit élevé, la vérification constante de ces conditions peut vraiment ralentir les choses, en particulier si elles se trouvent dans des boucles fréquemment exécutées. Le -O flag indique à l'interpréteur Python de changer fondamentalement la façon dont il compile votre code source en bytecode. Plus précisément, il génère une sortie qui rejette complètement les assertions.

Le compilateur fait disparaître les instructions assert du jeu d'instructions avant le chargement de votre programme. Cela ne signifie pas seulement des fichiers de bytecode légèrement plus petits, mais cela élimine la surcharge de calcul associée à la vérification de ces conditions pendant l'exécution du code.

Se débarrasser des assertions n'est pas la seule chose à faire. -O le drapeau le fait. Il modifie fondamentalement l'environnement d'exécution en forçant la constante globale intégrée __debug__ à Faux. Normalement, sans l'indicateur d'optimisation, __debug__ la valeur par défaut est true, ce qui permet aux blocs de code de diagnostic d'être protégés par if __debug__: courir. Cependant, lorsque l'optimisation est active, le compilateur Python effectue l'élimination du code mort sur l'ensemble de ces blocs.

Puisque la valeur de __debug__ est déterminé lorsque le bytecode est généré, l'interpréteur coupe l'arborescence logique de votre script avant même que le programme ne commence à s'exécuter. Les chemins de code destinés uniquement aux diagnostics de développement sont complètement supprimés, empêchant l'interpréteur de perdre des cycles à vérifier les conditions dont il sait déjà qu'elles sont fausses.

Fondamentalement, il vous permet de suivre les pratiques de codage Pythonic en laissant l'instrumentation de diagnostic dans vos fichiers sources sans nuire aux performances en production, puisque le compilateur ignore simplement ces segments lors de la traduction en bytecode.

Suppression du bytecode pour une efficacité maximale

La norme -O le drapeau est génial, mais si vous avez besoin de quelque chose de beaucoup plus agressif, -OO est pour vous. Cela fait vraiment monter les choses d'un cran en supprimant complètement les docstrings du bytecode, modifiant ainsi totalement la sortie compilée.

Lorsque l'interpréteur s'exécute en utilisant -OOil supprime tous ces littéraux de chaîne qui définissent la documentation de vos modules, classes et fonctions, afin qu'ils ne puissent pas être chargés dans le __doc__ attribut plus tard. Puisque le Python moderne suit le PEP 488, cela vous donne .opt-2.pyc fichiers, qui sont totalement différents de vos fichiers habituels .pyc cache ou le .opt-1.pyc versions issues de l'optimisation de base.

N'oubliez pas que vous échangez des fonctionnalités contre une meilleure consommation de ressources. Ce processus réduit considérablement à la fois votre empreinte mémoire et le résultat final. .pyc taille du fichier car Python n'a pas besoin d'allouer de RAM pour le texte qui n'est pas strictement nécessaire à l'exécution de la logique.

Économiser quelques mégaoctets peut sembler inutile sur votre gros bureau de développeur, mais cette réduction est absolument critique si vous travaillez avec des environnements conteneurisés, des microservices ou des systèmes embarqués. Dans ces déploiements à grande échelle, où un service peut être exécuté des milliers de fois sur un matériel limité, chaque mégaoctet de RAM compte vraiment.

Cette optimisation rend également votre temps de chargement beaucoup plus rapide dans l’ensemble. Étant donné que ces fichiers de bytecode compilés sont plus petits, l'interpréteur a besoin de moins de surcharge d'E/S pour les lire à partir du disque et de moins de cycles CPU pour analyser les structures des modules lors des importations. Cela permet de garder l'ensemble de votre jeu d'instructions agréable et simple, ce qui est exactement ce que vous souhaitez pour les outils d'interface de ligne de commande ou les processus de courte durée où la vitesse de démarrage est critique. C'est juste une technique de programmation vraiment intelligente pour faire de vous une élite.

Ce serait étrange s’il n’y avait pas d’inconvénients, mais il y en a. Le code qui dépend de l'introspection sera brisé lors de son utilisation -OO. Ceci concerne des outils comme doctest, pydoc ou toute bibliothèque qui tente d'analyser des docstrings pour générer du texte d'aide ou une logique d'exécution. Ainsi, vous ne devez enregistrer cette optimisation agressive que pour les déploiements de production où vous savez pertinemment que la base de code n'a pas besoin d'accéder à la documentation au moment de l'exécution.

Démarrage plus rapide avec l'isolation de l'environnement Python

En prime, vous avez également le -E flag, qui est une option de ligne de commande pour vous assurer que votre contexte d'exécution est propre. Il indique à l'interpréteur Python d'ignorer complètement tout PYTHON* variables d'environnement au démarrage. Dans les configurations de développement complexes, des variables telles que PYTHONPATH et PYTHONHOME personnalisez généralement l'endroit où Python recherche les modules ou définissez l'emplacement des bibliothèques standard.

C'est pratique pour une configuration utilisateur spécifique, mais ces variables obligent en fait l'interpréteur à analyser des dossiers supplémentaires et à analyser des chemins de fichiers supplémentaires à chaque lancement d'un script. Cela ajoute généralement une surcharge inutile au processus d'initialisation.

En exécutant Python avec -Evous ignorez ces recherches et évitez à l'interpréteur de perdre du temps à rechercher des chemins locaux, des répertoires définis par l'utilisateur ou des packages de site personnalisés dont votre script spécifique n'a certainement pas besoin. Cet indicateur agit essentiellement comme un bouton de réinitialisation localisé pour votre environnement d'exécution, afin que votre script démarre plus rapidement et plus proprement.

Vous souhaitez faire cela car si votre PYTHONPATH est obstrué par de nombreux répertoires, comme des lecteurs réseau mappés, cela ralentit considérablement la résolution du module. Vous risquez également de remplacer accidentellement les bibliothèques standard ou de provoquer des conflits de versions.

Pour être juste, le -I flag a une isolation encore plus stricte car il désactive également le répertoire du site utilisateur et supprime le dossier actuel de sys.pathc'est donc une bonne alternative. Cependant, -E cible spécifiquement le vecteur de variable d'environnement, ce qui est suffisant pour nettoyer le processus de démarrage lorsque c'est tout ce dont vous avez besoin.


L'interpréteur Python vous offre des outils puissants et intégrés pour prendre votre code sûr et lourd de diagnostic et le rendre simple pour la production. Toutes ces fonctionnalités dont vous avez absolument besoin lors de l'écriture, du débogage et des tests ne deviennent qu'une simple surcharge lorsque votre application s'exécute sous une lourde charge de production.

Vous pouvez obtenir des gains significatifs en termes de vitesse, de taille de mémoire et de vitesse de démarrage simplement en modifiant la commande que vous utilisez pour démarrer Python, le tout sans toucher à une seule ligne de votre code source réel. Les configurations système et les paramètres d'indicateur simples vous offrent souvent de meilleurs gains de performances immédiats que les heures passées à micro-optimiser votre logique métier.

★★★★★