Maison > Article > développement back-end > pourquoi python est lent
Python est un langage interprété de manière dynamique. Pour de nombreux développeurs, il est bien connu que Python s'exécute lentement. Sa caractéristique selon laquelle tout est un objet est l'une des raisons de son exécution lente. Voici trois raisons : raisons pour lesquelles Python est lent sous divers aspects.
Saisie dynamique
Python est typé dynamiquement plutôt que statiquement, ce qui signifie que lorsque le programme est exécuté, l'interprète ne connaît pas le type de la variable. Pour le langage C, le compilateur connaît le type d'une variable lorsqu'elle est déclarée ; pour Python, il sait seulement qu'une variable est une sorte d'objet Python lorsque le programme est exécuté.
Pour le code C suivant
int a = 1; int b = 2; int c = a + b;
Le compilateur sait toujours que a et b sont des entiers Lors de l'exécution de l'opération d'addition, le processus est le suivant :
Mettez c1d486739592e19159663e7144ffa124 1 est attribué à a
et bd43222e33876353aff11e13a7dc75f6 2 est attribué à b
Appel binaire_add4101e4c0559e7df80e541d0df514fd80(a, b)
et le résultat est attribué à c
Le code Python qui implémente la même fonction est le suivant :
a = 1 b = 2 c = a + b
Recommandations associées : "Tutoriel vidéo Python"
Le L'interprète sait seulement que 1 et 2 sont des objets, mais le type de cet objet n'est pas connu. Par conséquent, l'interpréteur doit vérifier le PyObject_HEAD de chaque variable pour connaître le type de variable, puis effectuer l'opération d'ajout correspondante, et enfin créer un nouvel objet Python pour enregistrer la valeur de retour. Le processus général est le suivant :
. La première étape, attribuez 1 à a
1. Définissez a->PyObject_HEAD->typecode sur un entier
2. Deuxième étape, attribuez 2 à b
1. Définissez a->PyObject_HEAD->typecode sur l'entier
2. 🎜>La troisième étape, appelez binaire_add4101e4c0559e7df80e541d0df514fd80(a, b)
1.a->PyObject_HEAD pour obtenir l'encodage de type
2.a est une valeur entière ; Obtenez l'encodage de type pour a->val
3.b->PyObject_HEAD
4.b est un entier, la valeur est b->val
5 .Appelez binaire_add4101e4c0559e7df80e541d0df514fd80(a->val, b->val)
6 Le résultat est un entier et est stocké dans result
La quatrième étape est pour créer l'objet c
1. Définissez c->PyObject_HEAD->typecode sur entier
2 Définissez c->val sur result
Le type dynamique signifie que. toute opération le sera. Il y a plus d'étapes impliquées. C'est la principale raison pour laquelle les opérations numériques de Python sont plus lentes que le langage C
Python est un langage interprétéCe qui précède introduit une différence entre le code interprété et le code compilé. Un compilateur intelligent peut anticiper et optimiser à l’avance les opérations répétées ou inutiles, ce qui peut entraîner des améliorations des performances. Les compilateurs sont un sujet important et ne seront pas abordés ici.
Le modèle objet de Python apportera un accès mémoire inefficacePar rapport aux entiers du langage C, nous avons souligné que Python possède une couche d'informations supplémentaire. Examinons maintenant la situation du tableau. En Python, nous pouvons utiliser l'objet List fourni dans la bibliothèque standard ; en langage C, nous utiliserons un tableau basé sur un tampon. Le tableau NumPy le plus simple est un objet Python construit autour de données C, ce qui signifie qu'il possède un pointeur vers un tampon de données contiguës. La liste Python contient des pointeurs vers des tampons de pointeurs continus. Chacun de ces pointeurs pointe vers un objet Python. Combinés avec l'exemple ci-dessus, ces objets Python sont un objet entier. Cette structure ressemble à ce qui suit
Il est facile de voir que si vous effectuez des opérations qui parcourent les données dans l'ordre, la disposition de la mémoire de numpy est plus efficace que celle de Python, à la fois en termes de coût de stockage et d'accès. coût du temps.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!