web-dev-qa-db-fra.com

Pourquoi compiler le code Python?

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?

228
ryeguy

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.

253
Georg Schölly

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.

77
Bill Karwin

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 = 1
  • Les instructions assert sont ignorées
  • __debug__ = False

Quatriè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.

48
fyngyrz

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

9
UnkwnTech

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 .

8
Simon B. Jensen

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.

7
matpie

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++.

5
user258532

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.

4
DrBwts

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)

2
David Z

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

1
Beginner