284 votes

Pourquoi compiler du code Python ?

Pourquoi compiler un script Python ? Vous pouvez les exécuter directement à partir du fichier .py et cela fonctionne bien, alors y a-t-il un avantage en termes de performances ou autre ?

Je remarque également que certains fichiers de mon application sont compilés en .pyc alors que d'autres ne le sont pas, pourquoi ?

0 votes

Vous pouvez également noter que, outre le démarrage plus rapide de votre application, vous gagnez également en sécurité, si vous ne pouvez pas partager votre code s'il s'agit d'un secret d'entreprise.

1 votes

@PSyLoCKe Vous n'en avez vraiment, vraiment pas. Le bytecode Python est vraiment lisible, parce que le compilateur n'a pas besoin de l'obscurcir pour l'optimiser. (Non pas qu'il l'optimise beaucoup...)

1 votes

La raison pour laquelle certains fichiers sont compilés automatiquement est parce qu'ils sont importés ; par exemple, si vous utilisez import mylib.py Python compilera mylib.py afin que les futurs import les déclarations courent un peu plus vite. Si vous modifiez ultérieurement mylib.py alors il sera recompilé la prochaine fois qu'il sera importé (Python utilise la date du fichier pour s'assurer que cela se produit).

315voto

Georg Schölly Points 63123

Il est compilé en bytecode qui peut être utilisé beaucoup, beaucoup, beaucoup plus rapidement.

La raison pour laquelle certains fichiers ne sont pas compilés est que le script principal, que vous invoquez avec python main.py est recompilé chaque fois que vous exécutez le script. Tous les script importés seront compilés et stockés sur le disque.

Ajout important par Ben Blank :

Il est intéressant de noter que lors de l'exécution d'une script compilé a un temps de réponse plus rapide. démarrage temps (car il n'a pas besoin d'être compilé), il n'est pas exécuter tout plus rapide.

317 votes

Il est intéressant de noter que si l'exécution d'un script compilé est plus rapide. démarrage temps (puisqu'il n'a pas besoin d'être compilé), il n'est pas exécuter plus rapidement.

31 votes

Une idée fausse et répandue. Merci de partager.

2 votes

En plus de ne pas nécessiter de compilation, le fichier .pyc est presque invariablement plus petit. Surtout si vous commentez beaucoup. L'un des miens est 28419 en .py, mais seulement 17879 en .pyc -- donc le temps de chargement est également meilleur. Enfin, vous pouvez précompiler les scripts de haut niveau de cette façon : python -m compileall myscript.py

91voto

Bill Karwin Points 204877

Le fichier .pyc est du Python qui a déjà été compilé en byte-code. Python exécute automatiquement un fichier .pyc s'il en trouve un portant le même nom qu'un fichier .py que vous invoquez.

"Une introduction à Python" dit ceci à propos des fichiers Python compilés :

Un programme ne s'exécute pas plus vite quand lorsqu'il est lu à partir d'un fichier '.pyc' ou '.pyo'. que lorsqu'il est lu à partir d'un fichier '.py'. La seule chose qui est plus rapide dans les fichiers ".pyc" ou ".pyo" est la vitesse est la vitesse à laquelle ils sont chargés.

L'avantage de l'exécution d'un fichier .pyc est que Python n'a pas à supporter les frais de compilation avant de l'exécuter. Puisque Python compile de toute façon en byte-code avant d'exécuter un fichier .py, il ne devrait pas y avoir d'amélioration des performances à part cela.

Quelle amélioration pouvez-vous obtenir en utilisant des fichiers .pyc compilés ? Cela dépend de ce que fait le script. Pour un script très bref qui imprime simplement "Hello World", la compilation pourrait constituer un pourcentage important du temps total de démarrage et d'exécution. Mais le coût de la compilation d'un script par rapport au temps d'exécution total diminue pour les script plus longs.

Le script que vous nommez en ligne de commande n'est jamais enregistré dans un fichier .pyc. Seuls les modules chargés par ce script "principal" sont enregistrés de cette manière.

7 votes

Dans de nombreux cas, il est difficile de voir une différence, mais j'ai un fichier python particulier avec plus de 300 000 lignes. (C'est un tas de calculs mathématiques générés par un autre script pour les tests) Il prend 37 secondes pour compiler, et seulement 2 secondes pour exécuter.

65voto

fyngyrz Points 325

Les avantages :

Tout d'abord, un obscurcissement léger et maîtrisable.

Deuxièmement, si la compilation donne lieu à un fichier nettement plus petit, vous obtiendrez des temps de chargement plus rapides. Une bonne chose pour le web.

Troisièmement : Python peut sauter l'étape de la compilation. Plus rapide à la charge initiale. Une bonne chose pour le CPU et le web.

Quatrièmement, plus vous commentez, plus le nombre de commentaires est réduit. .pyc o .pyo sera par rapport à la source .py fichier.

Cinquièmement : un utilisateur final avec seulement un .pyc o .pyo en main est beaucoup moins susceptible de vous présenter un bogue causé par une modification non rétablie dont ils ont oublié de vous parler.

Sixièmement : si vous visez un système embarqué, obtenez une taille plus petite de à intégrer peut représenter un avantage significatif, et l'architecture est stable, donc le premier inconvénient, détaillé ci-dessous, n'entre pas en jeu.

Compilation de haut niveau

Il est utile de savoir que vous pouvez compiler un fichier source python de haut niveau dans un fichier .pyc de cette façon :

python -m py_compile myscript.py

Cela supprime les commentaires. Il laisse docstrings intact. Si vous souhaitez vous débarrasser de la docstrings (vous devriez réfléchir sérieusement à la raison pour laquelle vous faites cela), puis compilez de cette façon...

python -OO -m py_compile myscript.py

...et vous obtiendrez un .pyo au lieu d'un fichier .pyc tout aussi distribuable en termes de fonctionnalité essentielle du code, mais plus petit en raison de la taille de la version dépouillée du fichier docstrings (et moins facile à comprendre pour un emploi ultérieur s'il avait été décent). docstrings en premier lieu). Mais voir le troisième inconvénient, ci-dessous.

Notez que python utilise l'option .py la date du fichier, si elle est présente, pour décider s'il doit exécuter la commande .py par opposition au fichier .pyc o .pyo --- donc modifiez votre fichier .py, et le fichier .pyc o .pyo est obsolète et tous les avantages que vous avez obtenus sont perdus. Vous devez le recompiler afin d'obtenir la .pyc o .pyo les avantages qui en découlent, tels qu'ils peuvent être.

Inconvénients :

Premièrement : Il y a un "cookie magique" dans .pyc y .pyo qui indique l'architecture du système dans lequel le fichier python a été compilé. Si vous distribuez l'un de ces fichiers dans un environnement d'un type différent, il sera cassé. Si vous distribuez le fichier .pyc o .pyo sans les frais associés .py pour recompiler ou touch il remplace donc le .pyc o .pyo l'utilisateur final ne peut pas non plus le réparer.

Deuxièmement : si docstrings sont ignorés avec l'utilisation de l'option -OO comme décrit ci-dessus, personne ne pourra accéder à ces informations, ce qui peut rendre l'utilisation du code plus difficile (ou impossible).

Troisièmement, le programme Python -OO met également en œuvre certaines optimisations conformément à l'option -O option de ligne de commande ; cela peut entraîner des changements dans le fonctionnement. Les optimisations connues sont :

  • sys.flags.optimize = 1
  • assert les déclarations sont ignorées
  • __debug__ = Faux

Quatrièmement : si vous aviez intentionnellement rendu votre script python exécutable avec quelque chose de l'ordre de #!/usr/bin/python sur la première ligne, celle-ci est supprimée dans le fichier .pyc y .pyo et cette fonctionnalité est perdue.

Cinquièmement : c'est un peu évident, mais si vous compilez votre code, non seulement son utilisation peut être affectée, mais le potentiel des autres à apprendre de votre travail est réduit, souvent sévèrement.

11voto

UnkwnTech Points 21942

Il y a une augmentation des performances lors de l'exécution de python compilé. Cependant, lorsque vous exécutez un fichier .py en tant que module importé, python le compile et le stocke, et tant que le fichier .py ne change pas, il utilise toujours la version compilée.

Avec n'importe quelle langue intercomplétée, lorsque le fichier est utilisé, le processus ressemble à quelque chose comme ceci :
1. Le fichier est traité par l'interpeter.
2. Le fichier est compilé
3. Le code compilé est exécuté.

évidemment en utilisant du code pré-compilé vous pouvez éliminer l'étape 2, ceci s'applique à python, PHP et autres.

Voici un article de blog intéressant qui explique les différences http://julipedia.blogspot.com/2004/07/compiled-vs-interpreted-languages.html
Et voici une entrée qui explique le processus de compilation de Python http://effbot.org/zone/python-compile.htm

7voto

sirlancelot Points 5896

Il y a certainement une différence de performance lors de l'exécution d'un script compilé. Si vous exécutez un script normal .py scripts, la machine le compile à chaque exécution et cela prend du temps. Sur les machines modernes, cela est à peine perceptible, mais au fur et à mesure que le scripts grandit, cela peut devenir un problème plus important.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X