Python ist eine dynamisch typisierte, interpretierte Sprache. Es ist allgemein bekannt, dass Python aufgrund seiner langsamen Ausführung langsam ist Ich möchte Ihnen einige Gründe nennen, warum Python langsam ist.
Python ist eine dynamische Sprache, keine statische Sprache
Das bedeutet, dass, wenn das Python-Programm ausgeführt wird, Kompilierung Der Compiler kennt den Typ der Variablen nicht. In C kennt der Compiler den Typ einer Variablen, wenn sie definiert wird, aber in Python weiß er erst, dass es sich um ein Objekt handelt, wenn er ausgeführt wird.
Wenn Sie also Folgendes in C schreiben:
/ * C代码* / int a = 1 ; int b = 2 ; int c = a + b ;
Der C-Compiler weiß von Anfang an, dass a und b ganze Zahlen sind: Sie können einfach nichts anderes sein! Mit diesem Wissen kann es eine Routine aufrufen, die zwei Ganzzahlen addiert und eine weitere Ganzzahl zurückgibt, die nur ein einfacher Wert im Speicher ist.
Der in C ausgeführte Prozess ist ungefähr wie folgt:
1 Zuweisen von
3. Rufen Sie die binäre Addition „binary_add(a, b)
4 mittel Der effektive Code lautet wie folgt:
# python code a = 1 b = 2 c = a + b
Hier weiß der Interpreter nur, dass 1 und 2 Objekte sind, weiß aber nicht, um welche Art von Objekten es sich handelt. Daher muss der Interpreter den PyObject_HEAD jeder Variablen überprüfen, um die Typinformationen zu finden, und dann die entsprechende Summierungsroutine für beide Typen aufrufen. Schließlich muss ein neues Python-Objekt erstellt und initialisiert werden, um den Rückgabewert zu speichern.
Der Ausführungsprozess ist ungefähr wie folgt:
1 Weisen Sie 1 einem
zu (1) Legen Sie a->PyObject_HEAD->typecode fest Ganzzahl
(2) Setze Seta->val = 1
2, weise 2 zu b
(1) Setze b->PyObject_HEAD->typecode auf Ganzzahl
(2) Setze b->val = 2
3. Rufe die binäre Addition „binary_add(a, b)“ auf.
(1) Finde den Typcode a- >PyObject_HEAD
(2) a ist eine Ganzzahl, der Wert ist a->val
(3) Finden Sie den Typcode b->PyObject_HEAD
( 4) b ist eine Ganzzahl, der Wert ist b->val
(5) Rufen Sie die binäre Addition Binary_add(a->val, b->val)
auf (6) Das Ergebnis ist result, eine Ganzzahl.
4. Erstellen Sie ein neues Objekt c
(1) Setzen Sie c->PyObject_HEAD->typecode auf Ganzzahl
(2) Ändern Sie die c->val-Zuweisung Ein dynamischer Typ für das Ergebnis
bedeutet, dass jede Operation mehr Schritte erfordert. Dies ist der Hauptgrund, warum Python bei numerischen Datenoperationen langsamer als C ist.
Python ist eher eine interpretierte Sprache als eine kompilierte SpracheDie Unterschiede zwischen interpretierten Sprachen und kompilierten Sprachen führen auch zu Unterschieden in der Geschwindigkeit der Programmausführung . . Ein intelligenter Compiler kann sich wiederholende und unnötige Vorgänge vorhersagen und optimieren. Dadurch wird auch die Geschwindigkeit der Programmausführung erhöht.
Pythons Objektmodell führt zu ineffizientem SpeicherzugriffIm obigen Beispiel führt die Verarbeitung von Ganzzahlen in Python im Vergleich zur C-Sprache zu einer zusätzlichen Ebene von Typinformationen . Wenn viele Ganzzahlen vorhanden sind und Sie eine Art Stapeloperation ausführen möchten, wird in Python häufig eine Liste und in C ein pufferbasiertes Array verwendet. In seiner einfachsten Form ist ein Numpy-Array ein Python-Objekt, das um ein Array in C herum aufgebaut ist. Das heißt, Numpy hat einen Zeiger, der auf den Wert der kontinuierlichen Cache-Bereichsdaten zeigt, während in Python die Python-Liste einen Zeiger hat, der nur den Bereich zwischenspeichern möchte. Jeder Zeiger zeigt auf ein Python-Cache-Objekt und jedes Objekt ist an ein Datum gebunden (in diesem Fall eine Ganzzahl). Schematische Diagramme dieser beiden Situationen:
Aus der obigen Abbildung geht hervor, dass bei der Bearbeitung von Daten (z. B. Sortieren, Berechnen, Suchen usw.) .), Numpy ist in Bezug auf Überlebenskosten und Zugriffskosten effizienter als Python.Das obige ist der detaillierte Inhalt vonWarum ist Python langsam?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!