Heim  >  Artikel  >  Backend-Entwicklung  >  Warum Python langsam ist

Warum Python langsam ist

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼Original
2019-06-25 16:07:503016Durchsuche

Python ist eine dynamisch typisierte, interpretierte Sprache. Es ist bekannt, dass Python langsam läuft. Seine Eigenschaft, dass alles ein Objekt ist, ist einer der Gründe für seine langsame Ausführung Gründe, warum Python aus verschiedenen Gründen langsam ist.

Warum Python langsam ist

Dynamische Typisierung

Python wird dynamisch und nicht statisch typisiert, was bedeutet, dass bei der Ausführung des Programms Der Interpreter kennt den Typ der Variablen nicht. Bei der Sprache C kennt der Compiler den Typ einer Variablen, wenn sie deklariert wird; bei Python weiß er erst, dass es sich bei einer Variablen um eine Art Python-Objekt handelt, wenn das Programm ausgeführt wird.

Für den folgenden C-Code

int a = 1;
int b = 2;
int c = a + b;

Der Compiler weiß immer, dass a und b Ganzzahlen sind. Beim Durchführen der Additionsoperation ist der Vorgang wie folgt:

Put c1d486739592e19159663e7144ffa124 1 ist a

und bd43222e33876353aff11e13a7dc75f6 2 ist b zugewiesen

Binary_add4101e4c0559e7df80e541d0df514fd80(a, b)

aufrufen und das Ergebnis anzeigen ist c zugewiesen

Der Python-Code, der dieselbe Funktion implementiert, lautet wie folgt:

a = 1
b = 2
c = a + b

Verwandte Empfehlungen: „Python Video Tutorial

The Der Interpreter weiß nur, dass 1 und 2 Objekte sind, aber der Typ dieses Objekts ist nicht bekannt. Daher muss der Interpreter den PyObject_HEAD jeder Variablen überprüfen, um den Variablentyp zu kennen, dann die entsprechende Additionsoperation ausführen und schließlich ein neues Python-Objekt erstellen, um den Rückgabewert zu speichern. Der allgemeine Vorgang ist wie folgt:

Der erste Schritt: Weisen Sie 1 einem

1 zu Zweiter Schritt: Weisen Sie b

1 zu 🎜>Im dritten Schritt rufen Sie Binary_add4101e4c0559e7df80e541d0df514fd80(a, b) auf

1.a->PyObject_HEAD, um die Typkodierung zu erhalten

2.a ist ein ganzzahliger Wert; Holen Sie sich die Typkodierung für a->val

3.b->PyObject_HEAD

4.b ist eine Ganzzahl, der Wert ist b->val

5. Rufen Sie Binary_add4101e4c0559e7df80e541d0df514fd80(a->val, b->val) auf

6. Das Ergebnis ist eine Ganzzahl und wird im Ergebnis gespeichert

Der vierte Schritt ist um Objekt c zu erstellen

1. Setzen Sie c->PyObject_HEAD->typecode auf integer

2. Setzen Sie c->val auf result

Dynamischer Typ bedeutet das Jeder Vorgang wird ausgeführt. Es sind weitere Schritte erforderlich. Dies ist der Hauptgrund, warum Pythons numerische Operationen langsamer sind als die C-Sprache

Python ist eine interpretierte Sprache

Das Obige führt einen Unterschied zwischen interpretiertem Code und kompiliertem Code ein. Intelligente Compiler können wiederholte oder unnötige Vorgänge im Voraus antizipieren und optimieren, was zu Leistungsverbesserungen führen kann. Compiler sind ein großes Thema und werden hier nicht behandelt.

Pythons Objektmodell führt zu ineffizientem Speicherzugriff

Im Vergleich zu den Ganzzahlen der C-Sprache haben wir darauf hingewiesen, dass Python über eine zusätzliche Informationsebene verfügt. Schauen wir uns nun die Array-Situation an. In Python können wir das in der Standardbibliothek bereitgestellte List-Objekt verwenden; in der Sprache C verwenden wir ein pufferbasiertes Array.

Das einfachste NumPy-Array ist ein Python-Objekt, das um C-Daten herum aufgebaut ist, was bedeutet, dass es einen Zeiger auf einen Puffer zusammenhängender Daten hat. Die Liste von Python enthält Zeiger auf kontinuierliche Zeigerpuffer. In Kombination mit dem obigen Beispiel handelt es sich bei diesen Python-Objekten um ein Ganzzahlobjekt. Diese Struktur sieht wie folgt aus:

Es ist leicht zu erkennen, dass das Speicherlayout von Numpy effizienter ist als das Speicherlayout von Python, wenn Sie Vorgänge ausführen, die die Daten der Reihe nach durchgehen, sowohl im Hinblick auf Speicherkosten als auch auf Zugriff Zeitaufwand.

Das obige ist der detaillierte Inhalt vonWarum Python langsam ist. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn