Pourquoi compiler du code Python?
pourquoi compiler un script Python? Vous pouvez exécuter directement à partir de l' .py fichier et il fonctionne très bien, donc, il y a un avantage en termes de performances ou de quelque chose?
je remarque aussi que certains fichiers de mon application sont compilés .pyc alors que d'autres ne le font pas, pourquoi cela?
10 réponses
Il est compilé en bytecode qui peut être utilisé beaucoup, beaucoup, beaucoup plus rapide.
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 scripts importés seront compilés et stockés sur le disque.
ajout Important par Ben Vide :
il est intéressant de noter que lors de l'exécution d'un le script compilé a un plus rapide démarrage le temps (comme il n'a pas besoin d'être compilé), il ne run aucun plus rapide.
The .pyc fichier Python qui a déjà été compilé en byte-code. Python exécute automatiquement un .pyc fichier si il en trouve un avec le même nom qu'un .py fichier que vous invoquez.
"Une Introduction à Python" dit ce sujet compilé des fichiers Python:
un programme ne fonctionne pas plus vite quand il est lu à partir d'un ‘.pyc’ ou ‘.pyo’ fichier que lorsqu'il est lu à partir d'un ‘.py’ fichier; la seule chose qui est plus rapide sur.‘ pyc’ ou ‘.pyo’ fichiers est la vitesse à laquelle ils sont chargés.
L'avantage de l'exécution d'un .le fichier pyc est que Python n'a pas à encourir la charge de le compiler avant de l'exécuter. Depuis Python compilerait en byte-code avant d'exécuter un .PY file de toute façon, il ne devrait pas y avoir d'amélioration de la performance à part ça.
combien d'amélioration pouvez-vous obtenir en utilisant compilé .dossiers pyc? Cela dépend de ce que le script le fait. Pour un script très bref qui imprime simplement "Hello World", la compilation pourrait constituer un grand pourcentage du temps total de démarrage et d'exécution. Mais le coût de compilation d'un script par rapport à la durée totale d'exécution diminue pour les scripts plus longs.
le script que vous nommez sur la ligne de commande n'est jamais sauvegardé sur A.dossier pyc. Seuls les modules chargés par ce script "principal" sont sauvegardés de cette façon.
plus:
D'abord: obfuscation légère et défaitable.
Second: si la compilation aboutit à un fichier beaucoup plus petit, vous obtiendrez des temps de chargement plus rapides. Nice pour le web.
troisième: Python peut sauter l'étape de compilation. Plus rapide à la charge initiale. Sympa pour le CPU et le web.
Quatrième: le plus vous commentez, plus les .pyc
ou .pyo
fichier sera en comparaison avec le fichier source .py
.
Cinquièmement: un utilisateur final avec seulement un fichier .pyc
ou .pyo
en main est beaucoup moins susceptible de vous présenter un bogue qu'ils ont causé par un changement Non-révéré dont ils ont oublié de vous parler.
sixième: si vous visez un système intégré, obtenir une plus petite taille fichier à intégrer peut représenter un atout important, et l'architecture est stable donc inconvénient, détaillées ci-dessous, n' entrent en jeu.
compilation de haut niveau
il est utile de savoir que vous pouvez compiler un fichier source de haut niveau en python 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 du docstrings
aussi bien (vous pourriez vouloir sérieusement penser à pourquoi vous faites cela) puis compiler cette façon à la place...
python -OO -m py_compile myscript.py
...et vous obtiendrez un fichier .pyo
au lieu d'un fichier .pyc
; également distribuable en termes de fonctionnalité essentielle du code, mais plus petit par la taille du docstrings
dépouillé (et moins facilement compris pour un emploi ultérieur s'il avait docstrings
décent en premier lieu). Mais voir inconvénient trois, ci-dessous.
notez que python utilise la date du fichier .py
, si elle est présente, pour décider si elle devrait exécutez le fichier .py
par opposition au fichier .pyc
ou .pyo
- - - alors modifiez votre .PY file, et le .pyc
ou .pyo
est obsolète et tous les avantages que vous avez obtenus sont perdus. Vous devez le recompiler afin d'obtenir les avantages .pyc
ou .pyo
de nouveau, comme ils peuvent être.
Inconvénients:
D'abord: il y a un "cookie magique" dans .pyc
et .pyo
fichiers qui indiquent l'architecture du système dans laquelle le fichier python a été compilé. Si vous distribuez un de ces fichiers dans un environnement de type différent, il va se casser. Si vous distribuez le .pyc
ou .pyo
sans le .py
associé à recompiler ou touch
ainsi il remplace le .pyc
ou .pyo
, l'utilisateur final ne peut pas le fixer, soit.
Second: si docstrings
sont sautés avec l'utilisation de la ligne de commande -OO
option comme décrit ci-dessus, personne ne sera en mesure d'obtenir cette information, ce qui peut rendre l'utilisation du code plus difficile (ou impossible.)
Troisièmement: l'option -OO
de Python implémente également certaines optimisations selon l'option de ligne de commande -O
; cela peut entraîner des changements dans le fonctionnement. Les optimisations connues sont:
-
sys.flags.optimize
= 1 -
assert
instructions sont ignorées -
__debug__
= faux
Quatrièmement: si vous avez intentionnellement Rendu votre script python exécutable avec quelque chose de l'ordre de #!/usr/bin/python
sur la première ligne, Ceci est retiré dans les fichiers .pyc
et .pyo
et cette fonctionnalité est perdue.
cinquième: quelque peu évident, mais si vous compilez votre code, non seulement son utilisation peut être affectée, mais le potentiel pour d'autres d'apprendre de votre travail est réduit, souvent gravement.
il y a une augmentation de performance dans l'exécution de python compilé. Cependant quand vous exécutez un .PY file comme un module importé, python le compilera et le stockera, et aussi longtemps que le .le fichier py ne change pas il utilisera toujours la version compilée.
avec n'importe quelle langue interposée quand le fichier est utilisé le processus ressemble à quelque chose comme ceci:
1. Fichier est traité par l'interprète.
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, cela s'applique à python, PHP et autres.
voici un billet de blog intéressant expliquant 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
il y a certainement une différence de performance lors de l'exécution d'un script compilé. Si vous exécutez des scripts .py
normaux, la machine le compile à chaque fois qu'il est exécuté et cela prend du temps. Sur les machines modernes, cela est à peine perceptible, mais au fur et à mesure que le script grandit, il peut devenir plus problématique.
comme déjà mentionné, vous pouvez obtenir une augmentation de performance en ayant votre code python compilé dans bytecode. Cela est généralement géré par python lui-même, pour les scripts importés seulement.
une autre raison pour laquelle vous pourriez vouloir compiler votre code python, pourrait être de protéger votre propriété intellectuelle contre la copie et/ou la modification.
vous pouvez en savoir plus à ce sujet dans la documentation Python .
Nous utilisons le code compilé à distribuer aux utilisateurs qui n'ont pas accès au code source. Fondamentalement pour arrêter les programmeurs inexpérimentés en changeant accidentellement quelque chose ou en réparant des bogues sans nous le dire.
Yep, la performance est la principale raison, et, autant que je sache, la seule raison.
si certains de vos fichiers ne sont pas compilés, peut-être que Python n'est pas capable d'écrire à la .le fichier pyc, peut-être à cause des permissions du répertoire ou quelque chose comme ça. Ou peut-être que les fichiers non compilés ne sont pas chargés... (les scripts/modules ne sont compilés que lorsqu'ils sont chargés pour la première fois)
les débutants supposent que Python est compilé à cause de .fichiers pyc. Le. le fichier pyc est le bytecode compilé, qui est alors interprété. Donc, si vous avez déjà utilisé votre code Python et que vous l'avez .le fichier pyc est pratique, il s'exécute plus rapidement la deuxième fois, car il n'a pas besoin de recompiler le bytecode
compilateur: Un compilateur est un morceau de code qui traduit le langage de haut niveau en langage machine
Interprètes: Les interprètes convertissent également le langage de haut niveau en équivalents binaires lisibles par machine. Chaque fois qu'un interpréteur obtient un code de langue de haut niveau à exécuter, il convertit le code en code intermédiaire avant de le convertir en code machine. Chaque partie du code est interprété, et puis l'exécuter séparément dans une séquence et une erreur est trouvée dans une partie du code, il va arrêter l'interprétation du code sans traduire le prochain jeu de la code.
Sources: http://www.toptal.com/python/why-are-there-so-many-pythons http://www.engineersgarage.com/contribution/difference-between-compiler-and-interpreter
quelque chose qui n'a pas été abordé est compilation de source à source . Par exemple, nuitka
traduit le code Python en C/C++, et le compile en code binaire qui tourne directement sur le CPU, au lieu du bytecode Python qui tourne sur la machine virtuelle plus lente.
cela peut conduire à des vitesses significatives, ou cela vous permettrait de travailler avec Python alors que votre environnement dépend du code C/C++.