J'ai fait beaucoup de recherches sur la façon dont Python est exécuté

Je n'ai utilisé Python que comme extension de scripts shell, mais récemment je l'ai utilisé pour une utilisation un peu plus décente. Puis, en tant que passionné de basse couche, je me demandais comment Python était exécuté. Alors je l'ai ramassé et je l'ai mangé.

Implémentation Python

L'histoire selon laquelle la spécification et l'implémentation du langage sont des choses différentes.

Il n'y a qu'un seul langage, Python, mais il existe plusieurs façons d'obtenir les fonctionnalités de ce langage. CPython et PyPy sont les noms de l'implémentation du langage Python. En parlant de langage C, il semble que GCC ou Clang puisse être sélectionné comme compilateur. Pour les types d'implémentations Python, voir Python Wikipedia. Il y en a beaucoup.

Ainsi, parmi diverses implémentations, CPython est l'implémentation dite de référence, qui est implémentée par l'auteur original de Python, et l'environnement d'exécution Python dans le monde est à peu près celui-ci, qui est exactement la position d'origine.

Comme vous pouvez l'imaginer d'après son nom, CPython est implémenté en langage C et PyPy est implémenté en Python. Et PyPy est plus rapide que CPython. Hmm? Qu'est-ce que cela signifie que PyPy est plus rapide que CPython lorsque C est plus rapide que Python? Je voudrais expliquer un peu à ce sujet.

Comment fonctionne CPython

Si vous lisez CPython Wikipedia,

CPython est un interpréteur de bytecode.

une. Hmm, interpréteur de code d'octet. Qu'Est-ce que c'est?

Un code d'octet est une expression intermédiaire. En d'autres termes, dans l'environnement CPython, Python est d'abord converti en bytecode, et le bytecode est exécuté par la machine virtuelle (VM). Il est appelé un interpréteur de code d'octet car il interprète et exécute les codes d'octet de manière séquentielle.

La raison de faire cela semble être que c'est plus rapide, mais je ne suis pas sûr de savoir pourquoi le temps d'exécution total est nettement plus rapide avec le code d'octet dans le langage exécuté sur l'interpréteur. Il n'y en avait pas. Cependant, au moins l'implémentation de l'interpréteur sera rafraîchissante, et si le code d'octet est laissé en cache, la plupart des traitements tels que l'analyse syntaxique ne seront pas effectués à partir de la deuxième fois, et cela semble certainement logique. Lorsque vous exécutez du code Python, des fichiers .pyc et des répertoires \ _ \ _ pycache \ _ \ _ sont créés, mais il semble que des codes d'octets y soient enregistrés. Il semble possible de prendre uniquement ces codes d'octets dans un autre environnement et de les exécuter.

cette? À propos, il existe un langage célèbre avec de telles spécifications. Oui, Java. Au début de la description Java, il y a une description que le code Java est converti en code d'octet et que Jave VM l'exécute. En Python et Java, le code source est converti (compilé) en code octet, puis la VM (interpréteur) l'exécute. Java est reconnu comme un langage de compilation et Python comme un langage d'interprétation, mais la réalité est que la compilation se fait explicitement ou implicitement.

Pourquoi PyPy est si rapide

Pourquoi PyPy est-il écrit en Python plus rapidement que CPython? Ceci est dû au fait que la compilation JIT (Just In Time) est effectuée.

Qu'est-ce que la compilation JIT? En gros, lorsque vous l'exécutez, il sera compilé dans un langage machine puis exécuté, donc ce sera plus rapide. Par exemple, considérez le traitement en boucle et les fonctions qui sont appelées plusieurs fois. S'il s'agit d'un interpréteur simple, la grammaire sera interprétée à chaque fois que ces codes sont appelés, et l'interpréteur exécutera le traitement en fonction du contenu. Puisque l'état réel de l'interpréteur est naturellement une collection de mots machine, après tout, c'est comme exécuter le langage machine après avoir exécuté le code ⇒ conversion en langage machine à chaque fois. Ensuite, si le code appelé à plusieurs reprises est converti ensemble en langage machine et que le langage machine est exécuté directement lorsque le même code est appelé, il semble que le temps de traitement de la conversion puisse être réduit. De plus, un interpréteur qui convertit le code ligne par ligne ne peut pas être optimisé en fonction du flux de traitement, mais si le code est lu et converti dans une certaine mesure dans un lot, une certaine optimisation peut être possible. ..

Cependant, il existe différentes méthodes pour accélérer la compilation JIT, et honnêtement, je ne comprends pas quelle est la clé pour accélérer. De plus, PyPy semble utiliser une méthode spéciale de compilation JIT du code de traitement, et il semble difficile d'en comprendre le contenu.

En passant, si vous regardez la page de téléchargement de PyPy, il est indiqué que le compilateur JIT ne fonctionne que sur les processeurs Intel.

These binaries include a Just-in-Time compiler. They only work on x86 CPUs that have the SSE2 instruction set (most of them do, nowadays), or on x86-64 CPUs. They also contain stackless extensions, like greenlets.

Je suppose parce que je n'ai pas vérifié la source, mais la compilation JIT signifie qu'il existe un processus dans le système de traitement du langage qui génère un assemblage qui dépend de l'architecture du processeur. La mise en œuvre d'un traitement qui correspond à de nombreuses architectures de CPU dans le monde est une tâche difficile à imaginer. Il ne peut être implémenté que pour les processeurs Intel avec un grand nombre d'utilisateurs.

Si vous utilisez PyPy, lorsque vous exécutez du code Python, PyPy le lit et l'exécute. Alors, qui exécute PyPy écrit en Python? Apparemment, le code Python de PyPy a été converti en C et compilé en binaire est en cours d'exécution.

Prise en charge de la compilation Numba JIT

J'ai trouvé que PyPy a un compilateur JIT intégré et est rapide, mais au fait, Python avait une bibliothèque appelée Numba qui compile JIT. En regardant le Guide Numba, il semble qu'il supporte un nombre raisonnable d'architectures CPU.

Architecture: x86, x86_64, ppc64le. Experimental on armv7l, armv8l (aarch64).

Numba travaille-t-il dur pour implémenter le support par architecture?

Après quelques recherches, Numba semble utiliser LLVM. Si vous utilisez LLVM, si vous convertissez le code Python en LLVM IR (une expression intermédiaire de LLVM), la LLVM gérera chaque architecture CPU, il n'est donc pas nécessaire de la prendre en charge du côté Numba.

Résumé

J'ai essayé de savoir comment le code Python est exécuté à volonté. J'ai senti qu'il n'y avait presque aucune frontière entre le langage d'interprétation et le langage de compilation. Il compile dans le langage d'interprétation pour la vitesse, et certains langages de compilation fonctionnent comme un interprète pour plus de commodité. Je pensais connaître la compilation JIT, mais je ne connaissais pas du tout les détails.

référence

Comment le système de traitement Python est-il implémenté et comment fonctionne-t-il? Python est-il interprété un par un ou est-il compilé?

Recommended Posts

J'ai fait beaucoup de recherches sur la façon dont Python est exécuté
J'ai fait un peu de recherche sur la classe
Je veux démarrer beaucoup de processus à partir de python
J'ai créé beaucoup de fichiers pour la connexion RDP avec Python
Connectez beaucoup de Python ou et et
Ce que j'ai fait avec les tableaux Python
Un mémo qui a fait un tutoriel pour exécuter python sur heroku
Créer un environnement d'exécution Python sur IBM i
En Python, changez le comportement de la méthode en fonction de la façon dont elle est appelée
Combien de types de Python avez-vous dans votre macOS? J'avais 401 types.
Installez séparément une version de Python qui n'est pas préinstallée sur votre Mac
Soudain, j'avais besoin de travailler sur un projet utilisant Python et Pyramid, donc une note sur la façon dont j'étudie
J'ai essayé de résumer comment utiliser matplotlib de python
[Exemple d'amélioration de Python] Apprentissage des bases de Python sur un site gratuit en 2 semaines
Puisque le memory_profiler de python est lourd, je l'ai mesuré
Comment écrire un type liste / dictionnaire de Python3
Python qui fusionne beaucoup d'excellence en un seul Excel
J'ai créé un environnement Python3 sur Ubuntu avec direnv.
Comment créer un environnement Django (python) sur Docker
Python + sélénium pour GW beaucoup de publicités par courrier électronique
J'ai essayé d'utiliser Python (3) au lieu d'un calculateur de fonctions
J'ai réfléchi à la raison pour laquelle Python self est nécessaire avec le sentiment d'un interpréteur Python
Différence de sys.path en fonction du démarrage de Python (v3.8.2)
J'ai pensé à un cours pour débutants sur Python basé sur des jeux blockchain
Un mémorandum où je suis tombé sur mon HEROKU & Python personnel (Flask)
[Python] Comment créer une liste de chaînes de caractères caractère par caractère
Comment créer un nouvel environnement virtuel Python sur Ubuntu
Sakura L'histoire du fonctionnement de la bouteille Python sur Internet
Comment mélanger une partie de la liste Python (au hasard.shuffle)
[python] Inversez avec des tranches! !! (Il y a aussi un commentaire sur les tranches!)
Record des leçons de l'enfer imposées aux étudiants débutants en Python
Discord's Python 1.5 ou version ultérieure, je ne parviens pas à obtenir la liste des membres
J'ai essayé "Comment obtenir une méthode décorée en Python"
Comment développer dans un environnement virtuel Python [Memo]
Comment enregistrer un package dans PyPI (à partir de septembre 2017)
[Blender x Python] Organisons une grande quantité de Susanne proprement !!
Comment obtenir une liste d'exceptions intégrées pour python
Un résumé de l'apprentissage automatique Python pour débutant est très concis.
Je suis tombé sur TensorFlow (Quelle est la mémoire du GPU)
J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python
Comment utiliser __dict__ en Python
Manipulation de python sur mac
La liste Python n'est pas une liste
J'ai fait un texte Python
J'ai exécuté python sur Windows
[Python] Qu'est-ce qu'une tranche? Une explication facile à comprendre de son utilisation avec un exemple concret
Automatisation d'une recherche sur des informations géographiques telles que le réseau de magasins à l'aide de Python et de l'API Web
Comment faire coexister Python 3.x et 2.x sur Mac (j'ai également inclus opencv en bonus)
L'exécution d'un grand nombre de Python3 Executor.submit peut consommer beaucoup de mémoire.
Notez ce que vous avez fait pour utiliser Flycheck avec Python
[Python] Comment forcer une méthode d'une sous-classe à effectuer un processus spécifique
[Python] J'ai écrit la route du typhon sur la carte en utilisant le folium
Je sais, mais je ne peux pas m'arrêter - Python est une collection d'erreurs courantes
J'ai essayé de créer une expression régulière de "montant" en utilisant Python
Est-il facile de synthétiser un médicament sur le marché?
Scripting Language C —— Comment un fichier texte sans shebang est exécuté