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?

206
demandé sur random 2009-01-23 01:57:34

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.

229
répondu Georg Schölly 2017-05-23 12:10:44

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.

72
répondu Bill Karwin 2009-01-22 23:14:33

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.

35
répondu fyngyrz 2015-07-29 18:17:23

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

9
répondu UnkwnTech 2015-08-14 17:56:06

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.

7
répondu matpie 2009-01-22 23:02:39

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 .

7
répondu Simon B. Jensen 2009-01-22 23:09:53

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.

3
répondu DrBwts 2015-06-15 16:14:32

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)

2
répondu David Z 2009-01-22 23:03:58

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

1
répondu Beginner 2014-01-08 14:13:34

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

1
répondu user258532 2017-12-23 19:30:11