linker matplotlib - Ist es machbar, Python mit Maschinencode zu kompilieren?




example legend (11)

Wie durchführbar wäre es, Python (möglicherweise über eine intermediäre C-Repräsentation) in Maschinencode zu übersetzen?

Vermutlich müsste es eine Verbindung zu einer Python-Laufzeitbibliothek herstellen, und alle Teile der Python-Standardbibliothek, die Python selbst waren, müssten ebenfalls kompiliert (und verknüpft) werden.

Außerdem müssten Sie den Python-Interpreter bündeln, wenn Sie eine dynamische Auswertung von Ausdrücken durchführen möchten, aber vielleicht wäre eine Untergruppe von Python, die dies nicht erlaubt, trotzdem nützlich.

Würde es irgendwelche Vorteile bei der Geschwindigkeit und / oder Speichernutzung bieten? Vermutlich würde die Startzeit des Python-Interpreters entfallen (obwohl Shared Libraries beim Start noch geladen werden müssten).


Answers

PyPy ist ein Projekt zur Neuimplementierung von Python in Python, wobei Kompilierung als systemeigener Code als eine der Implementierungsstrategien verwendet wird (andere sind eine VM mit JIT, mit JVM usw.). Ihre kompilierten C-Versionen laufen im Durchschnitt langsamer als CPython, aber für einige Programme viel schneller.

Shedskin ist ein experimenteller Python-zu-C ++ - Compiler.

Pyrex ist eine speziell für das Schreiben von Python-Erweiterungsmodulen entwickelte Sprache. Es wurde entwickelt, um die Lücke zwischen der schönen, hochentwickelten und einfach zu bedienenden Welt von Python und der chaotischen, Low-Level-Welt von C zu schließen.


Die Antwort ist "Ja, es ist möglich". Sie könnten Python-Code verwenden und versuchen, ihn mithilfe der CPython-API in den entsprechenden C-Code zu kompilieren. In der Tat gab es ein Python2C-Projekt, das genau das tat, aber ich habe seit vielen Jahren nichts mehr davon gehört (zurück in Python war es 1,5 Tage, als ich es das letzte Mal gesehen habe.)

Sie könnten versuchen, den Python-Code so weit wie möglich in natives C zu übersetzen und auf die CPython-API zurückzugreifen, wenn Sie tatsächliche Python-Funktionen benötigen. Ich habe die letzten ein oder zwei Monate mit dieser Idee gespielt. Es ist jedoch eine Menge Arbeit, und eine enorme Menge an Python - Features ist sehr schwer in C zu übersetzen: geschachtelte Funktionen, Generatoren, alles andere als einfache Klassen mit einfachen Methoden, alles was das Modifizieren von Modul - Globalen von außerhalb des Moduls betrifft , etc.




Pyrex ist eine Teilmenge der Python-Sprache, die nach C kompiliert wird, von dem Typ, der zuerst Listenkompromittierungen für Python erstellt hat. Es wurde hauptsächlich für Gebäudehüllen entwickelt, kann aber in einem allgemeineren Kontext verwendet werden. Cython ist eine aktivere Variante von Pyrex.


Psyco ist eine Art Just-in-Time (JIT) -Compiler: der dynamische Compiler für Python, der den Code 2-100 mal schneller ausführt, aber viel Speicher benötigt.

Kurz gesagt: Es führt Ihre vorhandene Python-Software viel schneller aus, ohne dass sich Ihre Quelle ändert, aber es kompiliert nicht so wie ein C-Compiler für Objektcode.


Dies mag auf den ersten Blick vernünftig erscheinen, aber es gibt viele gewöhnliche Dinge in Python, die nicht direkt auf eine C-Repräsentation abbildbar sind, ohne einen Großteil der Laufzeitunterstützung von Python zu übernehmen. Zum Beispiel kommt Ente tippen in den Sinn. Viele Funktionen in Python, die Eingaben lesen, können eine Datei oder ein dateiähnliches Objekt aufnehmen, solange sie bestimmte Operationen unterstützen, z. read () oder readline (). Wenn Sie darüber nachdenken, was es braucht, um diese Art von Unterstützung auf C zu übertragen, beginnen Sie sich genau die Dinge vorzustellen, die das Python-Laufzeitsystem bereits tut.

Es gibt Dienstprogramme wie py2exe , die ein Python-Programm und eine Runtime in einer einzigen ausführbaren Datei bündeln (so weit wie möglich).


Jython hat einen Compiler, der auf JVM-Bytecode abzielt. Der Bytecode ist voll dynamisch, genau wie die Python-Sprache selbst! Sehr cool. (Ja, wie die Antwort von Greg Hewgill andeutet, verwendet der Bytecode die Jython-Laufzeit und daher muss die Jython-JAR-Datei mit Ihrer App verteilt werden.)


Nuitka ist ein Python-zu-C ++ - Compiler, der mit libpython verlinkt. Es scheint ein relativ neues Projekt zu sein. Der Autor behauptet eine Geschwindigkeitsverbesserung gegenüber CPython auf dem pystone Benchmark.


Versuchen Sie ShedSkin Python-zu-C ++ - Compiler, aber es ist bei weitem nicht perfekt. Außerdem gibt es Psyco - Python JIT, wenn nur Beschleunigung benötigt wird. Aber IMHO ist das nicht die Mühe wert. Für geschwindigkeitskritische Teile des Codes wäre die beste Lösung, sie als C / C ++ Erweiterungen zu schreiben.


Nein, es gibt keine string.contains(str) -Methode, aber es gibt den in Operator:

if substring in someString:
    print "It's there!!!"

Hier ist ein komplexeres Arbeitsbeispiel:

# Print all files with dot in home directory
import commands
(st, output) = commands.getstatusoutput('ls -a ~')
print [f for f in output.split('\n') if '.' in f ]




python c linker compilation