Warum wird in Python ein Modul in C schneller implementiert als ein reines Python-Modul, und wie schreibe ich eines?

7

Die Python-Dokumentation besagt, dass der Grund, warum cPickle schneller als Pickle ist, dass ersteres in C implementiert ist. Was bedeutet das genau?

Ich mache ein Modul für fortgeschrittene Mathematik in Python, und einige Berechnungen brauchen eine beträchtliche Zeit. Bedeutet das, dass wenn mein Programm in C implementiert wird, es viel schneller gemacht werden kann?

Ich möchte dieses Modul aus anderen Python-Programmen importieren, genau wie ich cPickle importieren kann.

Kannst du erklären, wie man ein Python-Modul in C implementiert?

    
Pushpak Dagade 06.01.2011, 14:46
quelle

4 Antworten

13

Sie können schnellen C-Code schreiben und ihn dann in Ihren Python-Skripten verwenden, damit Ihr Programm schneller läuft. [1] Ссылка

Ein Beispiel ist Numpy, geschrieben in C ( Ссылка )

Eine typische Verwendung besteht darin, den Flaschenhals in C zu implementieren (oder natürlich eine in C geschriebene Bibliothek zu verwenden;)), aufgrund seiner Geschwindigkeit, und python für den verbleibenden Code zu verwenden

[1] übrigens, deshalb ist cPickle schneller als pickle

bearbeiten:

Werfen Sie einen Blick auf Pyrex: Ссылка

  

'Pyrex ist eine spezielle Sprache   Entwickelt für das Schreiben von Python-Erweiterungen   Module. Es ist entworfen, um das zu überbrücken   Lücke zwischen dem schönen, High-Level,   einfach zu bedienende Welt von Python und der   chaotisch, Low-Level-Welt von C. '

Es ist nicht der "offizielle" Weg, aber es kann nützlich sein

    
Ant 06.01.2011 14:54
quelle
6

Wie bereits erwähnt, eignet sich numpy hervorragend für Vektorberechnungen. (Könnte noch besser sein, aber der Kommentar, dass es besser ist als alles, was man schreiben könnte, ohne tatsächlich zu arbeiten, ist definitiv richtig.)

Nicht alles kann jedoch leicht vektorisiert werden. Wenn Sie also enge innere Schleifen mit vielen Funktionsaufrufen haben (sagen wir einen stark rekursiven Algorithmus), haben Sie immer noch ein paar Optionen: wahrscheinlich ist die beliebteste Cython , mit dem Sie Module und Funktionen in einer Art Python mit Anmerkungen schreiben können und C-ähnliche Geschwindigkeit erhalten, wenn Sie sie brauchen.

Oder vielleicht wird Ihre Zeit von Bibliotheksaufrufen beherrscht, um Eigenwerte zu berechnen oder Matrizen zu invertieren oder spezielle Funktionen auszuwerten oder wirklich große ganze Zahlen zu teilen - von denen viele sind Das Projekt von Sage funktioniert übrigens sehr gut, wenn das, was du tust, mathematischer ist als reines Knirschen - in diesem Fall spielt die Zeit in Python vielleicht keine Rolle. Es hängt alles von den Details der Art von Zahlen ab, die Sie tun.

    
DSM 06.01.2011 15:26
quelle
5

Wenn Sie eine Funktion in Python schreiben, wird ein neues Funktionsobjekt erstellt, der Funktionscode wird analysiert und bytekompiliert [und im Attribut func_code gespeichert]. Wenn Sie diese Funktion aufrufen, liest der Interpreter seinen Bytecode und führt ihn aus .

Wenn Sie dieselbe Funktion in C schreiben und der C / Python-API folgen, um sie in Python verfügbar zu machen, erstellt der Interpreter das Funktionsobjekt, aber diese Funktion hat keinen Bytecode. Wenn der Interpreter einen Aufruf an diese Funktion findet, ruft er die echte C-Funktion auf, also wird er mit "Maschinengeschwindigkeit" und nicht mit "Python-Maschinengeschwindigkeit" ausgeführt.

Sie können diese in C geschriebenen Prüffunktionen überprüfen:

%Vor%

Um zu verstehen, wie Sie C-Code für Python schreiben können, folgen Sie den Anleitungen auf der offiziellen Website.

Wie auch immer, wenn Sie nur N-dimensionale Array-Berechnungen durchführen, sollte numpy ausreichen.

    
Bakuriu 08.01.2011 17:33
quelle
3

Neben Pyrex / Cython, bereits erwähnt, haben Sie andere Alternativen:

Shed Skin : Übersetzt (eine eingeschränkte Teilmenge von) Python nach C ++. Kann automatisch eine Erweiterung für Sie generieren. Sie würden eine Erweiterung erstellen (Linux vorausgesetzt):

%Vor%

PyPy : Ein schneller Python mit einem JIT-Compiler. Sie könnten einfach Ihren Code anstelle von CPython ausführen. Unterstützt jetzt nur Python 2.5, 2.7 Unterstützung bald. Kann enorme Beschleunigung auf mathematischen Code geben. Um es zu installieren und auszuführen (angenommen Linux 32-Bit):

%Vor%

Weben : Erlaubt Ihnen schreibe C inline , das kompiliert es.

Bearbeiten: Wenn Sie möchten, dass wir diese Tools für Sie und den Benchmark ausführen, schreiben Sie einfach Ihren Code;)

    
TryPyPy 06.01.2011 20:30
quelle

Tags und Links