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.
c++
python
c
code-generation
CrazyFlyingCloseline
quelle
quelle
Antworten:
Ja. Schau dir Cython an . Es macht genau das: Konvertiert Python für Beschleunigungen in C.
quelle
cdef
Deklarationen hinzufügen und dadurch statische Typisierung einführen (andernfalls jonglieren Sie nur mit undurchsichtigemPyObject *
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."investieren" ist hier nicht das richtige Wort.
Erstellen Sie eine funktionierende Implementierung in Python. Sie werden dies lange vor Abschluss einer C-Version beenden.
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.
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.
quelle
Shed Skin ist "ein (eingeschränkter) Python-zu-C ++ - Compiler".
quelle
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. "
quelle
.exe
Erweiterung 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 seinpyinstaller
,py2exe
,py2app
usw. Die--recurse-***
Fahnen sind wichtig , richtig obwohl einzustellen.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 :
quelle
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.
quelle
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 ...
quelle
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 ..
quelle