Python-Programm in C / C ++ - Code konvertieren? [geschlossen]

149

Ist es möglich, ein Python-Programm nach C / C ++ zu konvertieren?

Ich muss ein paar Algorithmen implementieren, und ich bin mir nicht sicher, ob die Leistungslücke groß genug ist, um all die Schmerzen zu rechtfertigen, die ich durchmachen würde, wenn ich es in C / C ++ mache (was ich nicht gut kann). Ich dachte darüber nach, einen einfachen Algorithmus zu schreiben und ihn mit einer solchen konvertierten Lösung zu vergleichen. Wenn das alleine deutlich schneller ist als die Python-Version, habe ich keine andere Wahl, als es in C / C ++ zu tun.

CrazyFlyingCloseline
quelle
32
So viel Python bei Benchmarks verliert, denken Sie daran, dass diese 50- oder 100-fache Verlangsamung immer noch vernachlässigbar ist, wenn die Berechnung in Python in wenigen Sekunden abgeschlossen ist, und nicht einmal wahr, wenn Sie viel E / A ausführen oder einen schrecklichen Algorithmus haben. Anstatt zu fragen "Wie viel langsamer ist Python?" Sie sollten fragen: "Ist Python schnell genug?" (und es ist am wahrscheinlichsten, ehrlich gesagt) - das ist auch schneller als Benchmarking oder Fragen hier.
1
Das Implementieren eines Algorithmus in Python ist ziemlich schnell und unkompliziert ... Sie müssen es einfach tun und dann prüfen, ob es schnell genug ist. In den meisten Fällen können Sie den Algorithmus so optimieren , dass er mit verschiedenen Datenstrukturen (Diktat / Mengen anstelle von Listen ...) oder verschiedenen Operationen viel schneller ausgeführt wird. Auf jeden Fall sollte eine Optimierung erfolgen, nachdem Sie bereits einen ersten Entwurf des Algorithmus implementiert und ihn bewertet / profiliert haben.
Bakuriu
@delnan: In meinem Fall dreht sich alles um Rechenzeit. Wenn die C-Variante x Stunden weniger benötigt, würde ich diese Zeit investieren, um die Algorithmen länger / wieder laufen zu lassen. Ich möchte nur (ungefähr) herausfinden, wie viel langsamer Python wäre - wenn es nur ein paar Stunden wären, würde ich sicherlich keine Sprache verwenden, mit der ich nicht vertraut bin (Sie können die besten Lösungen für Probleme mit schlechten Implementierungen ruinieren: P).
CrazyFlyingCloseline
@ delnan hat recht damit, dass Python für viele Dinge wahrscheinlich schnell genug ist. Selbst wenn es langsamer ist, sind die einfache Entwicklung, Wartung und zukünftige Verbesserung wichtige Faktoren, die berücksichtigt werden müssen.
Martineau
"x Stunden"? Wie groß ist das Haben Sie eine Implementierung bewertet? Haben Sie Messungen? Haben Sie die Implementierung profiliert? Oder versuchen Sie, die Lösung vorzeitig zu optimieren?
S.Lott

Antworten:

115

Ja. Schau dir Cython an . Es macht genau das: Konvertiert Python für Beschleunigungen in C.

Lennart Regebro
quelle
6
Das erspart Ihnen natürlich nichts, wenn Sie nicht eine Reihe von cdefDeklarationen hinzufügen und dadurch statische Typisierung einführen (andernfalls jonglieren Sie nur mit undurchsichtigem PyObject *Material). Und es wird nie so schnell wie normales C, weil es normalerweise mit Python verbunden ist (100% oder mehr? Nur für einfachen numerischen Code, der die meiste Zeit überhaupt nicht mit Python zusammenarbeitet!). Aber anders als das, ja, es kann Ihnen eine ziemlich schnelle Beschleunigung bringen.
7
@delnan: Tatsächlich spart es dir etwas. Der meiste reine Python-Code ist nach dem Kompilieren schneller. Aber ja, mit den cdefs und der statischen Eingabe sehen Sie wirklich Unterschiede. Und die Schnittstelle zu Python erhalten Sie in allen Fällen, in denen Sie C von Python verwenden.
Lennart Regebro
136

Wenn die C-Variante x Stunden weniger benötigt, würde ich diese Zeit investieren, um die Algorithmen länger / wieder laufen zu lassen

"investieren" ist hier nicht das richtige Wort.

  1. Erstellen Sie eine funktionierende Implementierung in Python. Sie werden dies lange vor Abschluss einer C-Version beenden.

  2. Messen Sie die Leistung mit dem Python-Profiler. Beheben Sie alle Probleme, die Sie finden. Ändern Sie die Datenstrukturen und Algorithmen nach Bedarf, um dies wirklich richtig zu machen. Sie werden dies lange vor Abschluss der ersten Version in C beenden.

  3. Wenn es immer noch zu langsam ist, übersetzen Sie das gut gestaltete und sorgfältig konstruierte Python manuell in C.

    Aufgrund der Funktionsweise im Nachhinein ist das Ausführen der zweiten Version aus vorhandenem Python (mit vorhandenen Komponententests und vorhandenen Profildaten) immer noch schneller als der Versuch, den C-Code von Grund auf neu zu erstellen.

Dieses Zitat ist wichtig.

Thompsons Regel für erstmalige Teleskophersteller
Es ist schneller, einen 4-Zoll-Spiegel und dann einen 6-Zoll-Spiegel herzustellen, als einen 6-Zoll-Spiegel.

Bill McKeenan
Wang Institut

S.Lott
quelle
15
Ungeachtet der enormen Punktzahl sehe ich nicht, wie dies die Frage beantwortet.
Audrius Meskauskas
29

Shed Skin ist "ein (eingeschränkter) Python-zu-C ++ - Compiler".

kurzlebig
quelle
3
+1 Ein Vorteil von Shed Skin ist die Typinferenz : Wenn es möglich ist, Variablentypen aus dem Programmablauf zu erraten, wird eine dynamische Typprüfung vermieden. Dies führt normalerweise zu kürzerem C ++ - Code, den tatsächlich gelesen und zu schnelleren Programmen kompiliert werden kann.
Kyss Tao
1
Es gibt auch den Python → 11l → C ++ - Transpiler , der ebenfalls ein auf C ++ beschränkter Python-Compiler ist, jedoch einige Python-Funktionen unterstützt, die von Shed Skin nicht unterstützt werden (z. B. verschachtelte Funktionen / Closures).
11.
17

Ich bin gerade auf dieses neue Tool in den Hacker-News gestoßen.

Von ihrer Seite - "Nuitka ist ein guter Ersatz für den Python-Interpreter und kompiliert jedes Konstrukt, das CPython 2.6, 2.7, 3.2 und 3.3 bietet. Es übersetzt Python in ein C ++ - Programm, das dann" libpython "verwendet, um auf die gleiche Weise wie ausgeführt zu werden CPython tut dies auf sehr kompatible Weise. "

Möwe1089
quelle
Dieses Projekt ist so viel ausgereifter als andere ähnliche Optionen. Es ist lustig, dass es die Binärdatei mit einer .exeErweiterung unter OSX erstellt, obwohl es sich um eine völlig normale ausführbare OSX Mach-O-Datei handelt. Sieht aus wie könnte es ein guter Ersatz für sein pyinstaller, py2exe, py2appusw. Die --recurse-***Fahnen sind wichtig , richtig obwohl einzustellen.
ccpizza
Nuitka ist großartig, aber der erstellte C / C ++ - Code verwendet PyObject, das an die CPython-C-Code-Implementierung gebunden ist. Es wird kein idiomatischer C-Code erzeugt.
Make42
8

Eine weitere Option - neben Shed Skin auch die Konvertierung in C ++ - ist Pythran .

Um High Performance Python von Micha Gorelick und Ian Ozsvald zu zitieren :

Pythran ist ein Python-zu-C ++ - Compiler für eine Teilmenge von Python, die teilweise numpyUnterstützung enthält. Es verhält sich ein wenig wie Numba und Cython - Sie kommentieren die Argumente einer Funktion und übernehmen dann die weitere Typanmerkung und Codespezialisierung. Es nutzt Vektorisierungsmöglichkeiten und OpenMP-basierte Parallelisierungsmöglichkeiten. Es läuft nur mit Python 2.7.

Ein sehr interessantes Merkmal von Pythran ist, dass es versucht, Parallelisierungsmöglichkeiten automatisch zu erkennen (z. B. wenn Sie a verwenden map) und dies in parallelen Code umzuwandeln, ohne dass Sie zusätzlichen Aufwand benötigen. Sie können parallele Abschnitte auch mit pragma omp > Direktiven angeben . In dieser Hinsicht fühlt es sich der OpenMP-Unterstützung von Cython sehr ähnlich.

Hinter den Kulissen wird Pythran sowohl normalen Python- als auch Numpy-Code verwenden und versuchen, diese aggressiv in sehr schnelles C ++ zu kompilieren - sogar schneller als die Ergebnisse von Cython.

Sie sollten beachten, dass dieses Projekt noch jung ist und möglicherweise Fehler auftreten. Sie sollten auch beachten, dass das Entwicklungsteam sehr freundlich ist und dazu neigt, Fehler innerhalb weniger Stunden zu beheben.

Boardrider
quelle
6

Ich weiß, dass dies ein älterer Thread ist, aber ich wollte geben, was ich für hilfreiche Informationen halte.

Ich persönlich benutze PyPy, das mit pip sehr einfach zu installieren ist. Ich verwende austauschbar den Python / PyPy-Interpreter, Sie müssen Ihren Code überhaupt nicht ändern, und ich habe festgestellt, dass er ungefähr 40x schneller ist als der Standard-Python-Interpreter (entweder Python 2x oder 3x). Ich verwende pyCharm Community Edition, um meinen Code zu verwalten, und ich liebe ihn.

Ich schreibe gerne Code in Python, da Sie sich meiner Meinung nach mehr auf die Aufgabe als auf die Sprache konzentrieren können, was für mich ein großes Plus ist. Und wenn es noch schneller sein soll, können Sie jederzeit eine Binärdatei für Windows, Linux oder Mac kompilieren (nicht einfach, aber mit anderen Tools möglich). Aus meiner Erfahrung heraus bekomme ich beim Kompilieren eine etwa 3,5-fache Geschwindigkeit gegenüber PyPy, was 140-mal schneller als Python ist. PyPy ist für Python 3x- und 2x-Code verfügbar. Wenn Sie eine IDE wie PyCharm verwenden, können Sie ganz einfach zwischen PyPy, Cython und Python wechseln (dies erfordert jedoch ein wenig anfängliches Lernen und Einrichten).

Einige Leute mögen sich mit mir darüber streiten, aber ich finde, dass PyPy schneller ist als Cython. Aber beide sind eine gute Wahl.

Bearbeiten: Ich möchte noch eine kurze Anmerkung zum Kompilieren machen: Wenn Sie kompilieren, ist die resultierende Binärdatei viel größer als Ihr Python-Skript, da alle Abhängigkeiten darin eingebaut werden usw. Aber dann erhalten Sie einige eindeutige Vorteile: Geschwindigkeit!, Jetzt funktioniert die App auf jedem Computer (abhängig davon, für welches Betriebssystem Sie kompiliert haben, wenn nicht für alle. lol) ohne Python oder Bibliotheken. Sie verschleiert auch Ihren Code und ist technisch (bis zu einem gewissen Grad) produktionsbereit. Einige Compiler generieren auch C-Code, den ich nicht wirklich angeschaut oder gesehen habe, ob er nützlich ist oder nur Kauderwelsch. Viel Glück.

Hoffentlich hilft das.

Jacktrader
quelle
2
Ich weiß, dass dies ein älterer Kommentar ist, aber danke!
kfrncs
Kein Problem, ich bin froh, dass es nützlich war.
Jacktrader
Mit welcher Software kompilieren Sie aus der PyPy-Interpretation?
Vasyl Vaskivskyi
Nicht speziell PyPy, nur .py-Skripte. Nuitka, wenn Sie "C / C ++ - ausführbare Dateien oder C / C ++ - Quellcode" möchten, und PyInstaller, wenn Sie nur eine ausführbare Datei (einfacher) möchten. Es gibt auch py2exe, aber ich hatte weniger Erfolg damit, obwohl ich sicher bin, dass sich die Dinge verbessert haben. PyInstaller ist auch plattformübergreifend, nicht nur für ausführbare Windows-Dateien (funktioniert unter Linux und Mac). Nuitka ist einzigartig, weil ich denke, es ist der einzige "Compiler", der Ihnen nutzbaren Quellcode zurückgibt, den Sie theoretisch weiter optimieren könnten. Es gibt einige andere wie bbFreeze, cx_Freeze und py2app, aber ich habe sie nicht ausprobiert. Viel Glück!
Jacktrader
1
Ich habe auch festgestellt, dass PyPy schneller läuft als Cython. In einem Test stellte ich fest, dass PyPy dieselbe Geschwindigkeit wie eine C ++ - Version des Programms hat (Einfügesortierung).
Nv7
5

Mir ist klar, dass eine Antwort auf eine ganz neue Lösung fehlt. Wenn Numpy im Code verwendet wird, würde ich empfehlen, Pythran zu versuchen:

http://pythran.readthedocs.io/

Für die Funktionen, die ich ausprobiert habe, liefert Pythran extrem gute Ergebnisse. Die resultierenden Funktionen sind genauso schnell wie gut geschriebener Fortran-Code (oder nur geringfügig langsamer) und etwas schneller als die (ziemlich optimierte) Cython-Lösung.

Der Vorteil gegenüber Cython besteht darin, dass Sie nur Pythran für die für Numpy optimierte Python-Funktion verwenden müssen, sodass Sie nicht die Schleifen erweitern und Typen für alle Variablen in der Schleife hinzufügen müssen. Pythran nimmt sich Zeit, um den Code zu analysieren, damit er die Vorgänge versteht numpy.ndarray.

Dies ist auch ein großer Vorteil im Vergleich zu Numba oder anderen Projekten, die auf Just-in-Time-Kompilierung basieren und für die Sie (meines Wissens) die Schleifen erweitern müssen, um wirklich effizient zu sein. Und dann wird der Code mit den Schleifen sehr, sehr ineffizient, wenn nur CPython und Numpy verwendet werden ...

Ein Nachteil von Pythran: keine Klassen! Da aber nur die Funktionen kompiliert werden müssen, die wirklich optimiert werden müssen, ist das nicht sehr ärgerlich.

Ein weiterer Punkt: Pythran unterstützt die OpenMP-Parallelität gut (und sehr leicht). Aber ich glaube nicht, dass mpi4py unterstützt wird ...

paugier
quelle
4

http://code.google.com/p/py2c/ scheint eine Möglichkeit zu sein - sie erwähnen auch auf ihrer Website: Cython, Shedskin und RPython und bestätigen, dass sie Python-Code in reines C / C ++ konvertieren, das viel schneller als C ist / C ++ voller Python-API-Aufrufe. Hinweis: Ich habe es nicht ausprobiert, aber ich werde ..

Ashley
quelle
1
Es scheint, dass Py2C noch ein unvollendetes Projekt ist. Es wurde seit einigen Jahren nicht mehr aktualisiert, daher ist es möglicherweise nicht mehr verfügbar.
Anderson Green