Maison > Article > développement back-end > Pourquoi Python est-il 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. pour vous quelques raisons pour lesquelles python est lent, j'espère que cela vous sera utile.
Python est un langage dynamique, pas un langage statique
Cela signifie que lorsque le programme python est exécuté, compilation Le compilateur ne connaît pas le type de la variable. En C, le compilateur connaît le type d'une variable lorsqu'elle est définie, mais en python, il ne sait qu'il s'agit d'un objet qu'au moment de son exécution.
Donc si vous écrivez ce qui suit en C :
/ * C代码* / int a = 1 ; int b = 2 ; int c = a + b ;
Le compilateur C sait dès le départ que a et b sont des entiers : ils ne peuvent tout simplement pas être autre chose ! Fort de cette connaissance, il peut appeler une routine qui ajoute deux entiers et renvoie un autre entier qui n'est qu'une simple valeur en mémoire.
Le processus exécuté en C est à peu près le suivant :
1. Attribuez
2.
3. Appelez l'addition binaire binaire_add(a, b)
4. Attribuez la structure à la variable c
python. medium Le code effectif est le suivant :
# python code a = 1 b = 2 c = a + b
Ici l'interprète sait seulement que 1 et 2 sont des objets, mais ne sait pas de quel type d'objets il s'agit. L'interpréteur doit donc vérifier le PyObject_HEAD de chaque variable pour trouver les informations de type, puis appeler la routine de sommation appropriée pour les deux types. Enfin, il doit créer et initialiser un nouvel objet Python pour contenir la valeur de retour.
Le processus d'exécution est à peu près le suivant :
1. Attribuez 1 à un
(1) Définissez un->PyObject_HEAD->typecode à un. entier
(2) Définissez Seta->val = 1
2, attribuez 2 à b
(1) Définissez b->PyObject_HEAD->typecode sur entier
(2) Définir b->val = 2
3. Appeler l'addition binaire binaire_add(a, b)
(1) Trouver le code de type a- >PyObject_HEAD
(2) a est un entier, la valeur est a->val
(3) Recherchez le code de type b->PyObject_HEAD
( 4) b est un entier, la valeur est b->val
(5) Appeler l'addition binaire binaire_add(a->val, b->val)
(6) Le résultat est le résultat, qui est un entier.
4. Créez un nouvel objet c
(1) Définissez c->PyObject_HEAD->typecode sur un entier
(2) Modifiez l'affectation de c->val un type dynamique au résultat
signifie que toute opération nécessite plus d'étapes. C'est la principale raison pour laquelle Python est plus lent que C en ce qui concerne les opérations sur les données numériques.
Python est un langage interprété plutôt qu'un langage compilé
Les différences entre les langages interprétés et les langages compilés entraîneront également des différences dans la vitesse d'exécution du programme . Un compilateur intelligent peut prédire et optimiser les opérations répétitives et inutiles. Cela augmentera également la vitesse d’exécution du programme.
Le modèle objet de Python apportera un accès mémoire inefficace
Dans l'exemple ci-dessus, par rapport au langage C, opérer sur des entiers en python entraînera une couche supplémentaire d'informations de type . Lorsqu'il y a beaucoup d'entiers et que vous souhaitez effectuer une sorte d'opération par lots, une liste est souvent utilisée en python et un tableau basé sur un tampon est utilisé en C. Dans sa forme la plus simple, un tableau Numpy est un objet Python construit autour d'un tableau en C. C'est-à-dire que Numpy a un pointeur pointant vers la valeur des données de la zone de cache continue, tandis qu'en python, la liste python a un pointeur qui veut uniquement mettre en cache la zone. Chaque pointeur pointe vers un objet de cache python, et chaque objet. est lié à une donnée (un entier dans ce cas).
Schémas schématiques de ces deux situations :
Il ressort clairement de la figure ci-dessus que lors d'opérations sur des données (telles que le tri, le calcul, la recherche, etc. .), Numpy est plus efficace que python en termes de coût de survie et de coût d'accès.
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!