Pourquoi voudriez-vous compiler un script Python? Vous pouvez les exécuter directement à partir du fichier .py et cela fonctionne bien. Y at-il un avantage en termes de performances ou autre?
J'ai également remarqué que certains fichiers de mon application sont compilés dans .pyc, tandis que d'autres ne le sont pas. Pourquoi?
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 appelez 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 Blank :
Il est intéressant de noter que bien qu’un script compilé ait un temps de démarrage plus rapide (il n’a pas besoin d’être compilé), il n’en a pas courir plus rapidement.
Le fichier .pyc est Python qui a déjà été compilé en code octet. Python exécute automatiquement un fichier .pyc s'il en trouve un portant le même nom qu'un fichier .py que vous appelez.
"Une introduction à Python" dit ceci à propos des fichiers Python compilés:
Un programme ne s’exécute pas plus vite s’il est lu depuis un fichier ‘.pyc’ ou ‘.pyo’ que s’il est lu depuis un fichier ‘.py’; La seule chose qui est plus rapide avec les fichiers .pyc ou .pyo est la rapidité avec laquelle ils sont chargés.
L’avantage d’exécuter un fichier .pyc est que Python n’a pas à supporter la surcharge de sa compilation avant de l’exécuter. Etant donné que Python compilerait en code octet avant de lancer un fichier .py, il ne devrait y avoir aucune 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 le script fait. Pour un script très bref qui affiche simplement "Hello World", la compilation peut constituer un pourcentage élevé du temps total de démarrage et d’exécution. Mais le coût de la compilation d'un script par rapport au temps total d'exécution diminue pour les scripts plus longs.
Le script que vous nommez sur la 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.
Pluses:
Premièrement: obscurcissement léger et évitable.
Deuxièmement: si la compilation donne un fichier considérablement plus petit, les temps de chargement seront plus rapides. Bien pour le web.
Troisièmement: Python peut ignorer l'étape de compilation. Plus rapide à la charge initiale. Bien pour la CPU et le Web.
Quatrièmement: plus vous commentez, plus le fichier .pyc
ou .pyo
est petit par rapport au fichier source .py
.
Cinquièmement: un utilisateur final ne disposant que d’un fichier .pyc
ou .pyo
est beaucoup moins susceptible de vous présenter un bogue causé par un changement non annulé qu’il a oublié de vous signaler.
Sixièmement: si vous visez un système embarqué, obtenir un fichier de taille plus petite à incorporer peut représenter un avantage considérable, et l'architecture étant stable, un inconvénient, détaillé ci-dessous, n'entre pas en jeu.
compilation de premier nivea
Il est utile de savoir que vous pouvez compiler un fichier source python de niveau supérieur 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 également vous débarrasser de docstrings
(vous devriez peut-être réfléchir sérieusement à la raison pour laquelle vous le faites), alors compilez cette méthode à la place ...
python -OO -m py_compile myscript.py
... et vous obtiendrez un fichier .pyo
au lieu d'un fichier .pyc
; également distribuable du point de vue de la fonctionnalité essentielle du code, mais plus petit en raison de la taille de docstrings
dépouillé (et moins facile à comprendre pour un emploi ultérieur s'il avait décent docstrings
en premier lieu). Mais voir le troisième inconvénient ci-dessous.
Notez que python utilise la date du fichier .py
, s'il est présent, pour décider s'il doit exécuter le fichier .py
par opposition à .pyc
ou .pyo
fichier --- alors éditez votre fichier .py, et le .pyc
ou .pyo
est obsolète et tous les avantages que vous avez obtenus sont perdus. Vous devez le recompiler pour pouvoir récupérer les avantages .pyc
ou .pyo
, tels qu'ils peuvent être.
Inconvénients:
Premièrement: Il existe dans les fichiers .pyc
et .pyo
un "cookie magique" indiquant 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, ça va casser. Si vous distribuez le .pyc
ou .pyo
sans le .py
associé à recompiler ou touch
afin qu'il ne remplace pas le .pyc
ou .pyo
, l'utilisateur final ne peut pas le réparer. ça non plus.
Deuxièmement: si docstrings
est ignoré avec l’utilisation de l’option de ligne de commande -OO
comme décrit ci-dessus, personne ne sera en mesure d’obtenir cette information, ce qui pourrait rendre l’utilisation du code plus difficile (ou impossible).
Troisièmement: l'option -OO
de Python implémente également certaines optimisations conformément à l'option de ligne de commande -O
; cela peut entraîner des changements de fonctionnement. Les optimisations connues sont:
sys.flags.optimize
= 1assert
sont ignorées__debug__
= FalseQuatrièmement: si vous avez volontairement créé votre script python avec un ordre de l'ordre de #!/usr/bin/python
sur la première ligne, il est supprimé dans les fichiers .pyc
et .pyo
. et cette fonctionnalité est perdue.
Cinquièmement: un peu évident, mais si vous compilez votre code, son utilisation peut non seulement être affectée, mais le potentiel d’apprentissage par les autres de votre travail est réduit, souvent de manière sévère.
Il y a une augmentation des performances dans l'exécution de python compilé. Toutefois, lorsque vous exécutez un fichier .py en tant que module importé, python le compilera et le stockera. Tant que le fichier .py ne sera pas modifié, il utilisera toujours la version compilée.
Quelle que soit la langue utilisée lors de l'utilisation du fichier, le processus ressemble à ceci:
1. Le fichier est traité par l’interpètre.
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 article 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 Python http://effbot.org/zone/python-compile.htm
Comme déjà mentionné, vous pouvez obtenir une augmentation des performances de la compilation de votre code python en bytecode. Ceci est généralement géré par python lui-même, uniquement pour les scripts importés.
Une autre raison pour laquelle vous pourriez vouloir compiler votre code python pourrait être pour protéger votre propriété intellectuelle contre la copie et/ou la modification.
Vous pouvez en savoir plus à ce sujet dans le documentation Python .
Il y a certainement une différence de performances lors de l'exécution d'un script compilé. Si vous exécutez des scripts .py
normaux, la machine le compile à chaque exécution, ce qui prend du temps. Sur les machines modernes, cela est à peine perceptible, mais à mesure que le script se développe, cela peut devenir un problème.
Quelque chose qui n'est pas abordé est compilation source à source . Par exemple, nuitka
traduit le code Python en C/C++ et le compile en code binaire qui s'exécute directement sur le processeur, au lieu de Python bytecode qui s'exécute sur le plus lent. machine virtuelle.
Cela peut entraîner des accélérations importantes ou vous permettre de travailler avec Python alors que votre environnement dépend du code C/C++.
Nous utilisons du code compilé pour distribuer aux utilisateurs qui n'ont pas accès au code source. En gros, empêcher les programmeurs inexpérimentés de modifier accidentellement quelque chose ou de corriger des bogues sans nous le dire.
Oui, la performance est la raison principale et, à ma connaissance, la seule.
Si certains de vos fichiers ne sont pas compilés, peut-être que Python ne pourra-t-il pas écrire dans le fichier .pyc, peut-être à cause des droits d'accès au répertoire ou à un autre problème. Ou peut-être que les fichiers non compilés ne sont simplement jamais 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 des fichiers .pyc. Le fichier .pyc est le bytecode compilé, qui est ensuite interprété. Donc, si vous avez déjà exécuté votre code Python et que vous avez le fichier .pyc à portée de main, il s'exécutera plus rapidement la deuxième fois, car il n'aura pas à 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 évolué en équivalents binaires lisibles par machine. Chaque fois qu'un interprète doit exécuter un code de langage de haut niveau, il le convertit en un code intermédiaire avant de le convertir en code machine. Chaque partie du code est interprétée puis exécutée séparément dans une séquence. Si une erreur est détectée dans une partie du code, l’interprétation du code s’arrête sans que l’ensemble de codes suivant ne soit traduit.
Sources: http://www.toptal.com/python/why-are-there-so-many-pythonshttp://www.engineersgarage.com/contribution/difference-between-compiler-and-interpreter