Ich habe festgestellt, dass Python, wenn ich Python etwas mehr frage, meine Maschinenressource nicht zu 100% nutzt und es nicht wirklich schnell ist, es ist schnell im Vergleich zu vielen anderen interpretierten Sprachen, aber im Vergleich zu kompilierten Sprachen denke ich, dass der Unterschied ist wirklich bemerkenswert.
Ist es möglich, Dinge mit einem Just In Time (JIT) -Compiler in Python 3 zu beschleunigen?
Normalerweise ist ein JIT-Compiler das einzige, was die Leistung in interpretierten Sprachen verbessern kann. Ich beziehe mich also auf diese. Wenn andere Lösungen verfügbar sind, würde ich gerne neue Antworten akzeptieren.
python
python-3.x
jit
guz
quelle
quelle
multiprocssing
oderthreading
Module oder in C eine Verlängerung zu schreiben (was sein kann einfacher gemacht mit Cython oder ähnlicher Software).Antworten:
Zunächst einmal ist Python 3 (.x) eine Sprache, für die es eine beliebige Anzahl von Implementierungen geben kann. Okay, bis heute implementiert keine Implementierung außer CPython diese Versionen der Sprache. Aber das wird sich ändern (PyPy holt auf).
Um die Frage zu beantworten, die Sie stellen wollten: CPython, 3.x oder andere, enthält, hat und wird wahrscheinlich nie einen JIT-Compiler enthalten. Einige andere Python-Implementierungen (PyPy nativ, Jython und IronPython durch Wiederverwendung von JIT-Compilern für die virtuellen Maschinen, auf denen sie aufbauen) verfügen über einen JIT-Compiler. Und es gibt keinen Grund, warum ihre JIT-Compiler nicht mehr funktionieren würden, wenn sie Python 3-Unterstützung hinzufügen.
Aber während ich hier bin, möchte ich auch ein Missverständnis ansprechen:
Das ist nicht richtig. Ein JIT-Compiler entfernt in seiner grundlegendsten Form lediglich den Interpreter-Overhead, der einen Teil der beobachteten Verlangsamung ausmacht, nicht jedoch die Mehrheit. Ein guter JIT-Compiler führt auch eine Reihe von Optimierungen durch, die den für die Implementierung zahlreicher Python-Funktionen im Allgemeinen erforderlichen Overhead beseitigen (indem Sonderfälle erkannt werden, die eine effizientere Implementierung ermöglichen). Beispiele hierfür sind dynamische Typisierung, Polymorphismus und verschiedene introspektive Funktionen.
Einfach implementieren a Compilers hilft dabei nicht. Sie benötigen sehr clevere Optimierungen, von denen die meisten nur unter ganz bestimmten Umständen und für ein begrenztes Zeitfenster gültig sind. JIT-Compiler haben es hier leicht, weil sie zur Laufzeit speziellen Code generieren können (das ist ihr springender Punkt), das Programm einfacher (und genauer) analysieren können, indem sie es während der Ausführung beobachten, und Optimierungen rückgängig machen können, wenn sie ungültig werden. Sie können im Gegensatz zu früheren Compilern auch mit Dolmetschern interagieren und tun dies häufig, weil dies eine vernünftige Entwurfsentscheidung ist. Ich denke, dies ist der Grund, warum sie in den Köpfen der Menschen mit Dolmetschern verbunden sind, obwohl sie unabhängig existieren können und existieren.
Es gibt auch andere Ansätze, um die Python-Implementierung zu beschleunigen, abgesehen von der Optimierung des Interpreter-Codes selbst - zum Beispiel das HotPy (2) -Projekt. Diese befinden sich jedoch derzeit in der Forschungs- oder Experimentierphase und müssen ihre Wirksamkeit (und Reife) für echten Code erst noch zeigen.
Und natürlich hängt die Leistung eines bestimmten Programms viel mehr vom Programm selbst ab als von der Sprachimplementierung. Die Sprachimplementierung legt nur eine Obergrenze fest, wie schnell Sie eine Abfolge von Vorgängen ausführen können. Im Allgemeinen können Sie die Programmleistung viel besser verbessern, indem Sie unnötige Arbeit vermeiden, dh das Programm optimieren. Dies gilt unabhängig davon, ob Sie das Programm über einen Interpreter, einen JIT-Compiler oder einen vorzeitigen Compiler ausführen. Wenn Sie möchten, dass etwas schnell ist, geben Sie sich keine Mühe, um eine schnellere Sprachimplementierung zu erreichen. Es gibt Anwendungen, die mit dem Aufwand an Interpretation und Dynamik nicht realisierbar sind, aber nicht so häufig sind, wie Sie denken (und häufig durch selektives Aufrufen von maschinencodekompiliertem Code gelöst werden).
quelle
source code -> byte code -> native code
Und dann interpretiert der Mikroprozessor das in Mikrocode ...Die einzige Python-Implementierung mit JIT ist PyPy . Byt - PyPy ist sowohl eine Python 2-Implementierung als auch eine Python 3-Implementierung.
quelle
Das Numba-Projekt sollte unter Python 3 funktionieren. Obwohl es nicht genau das ist, was Sie gefragt haben, können Sie es ausprobieren: https://github.com/numba/numba/blob/master/docs/source/doc/userguide .rst .
Derzeit werden nicht alle Python-Syntax unterstützt.
quelle
Sie können den pypy py3-Zweig ausprobieren , der mehr oder weniger python-kompatibel ist, aber die offizielle CPython-Implementierung hat keine JIT.
quelle
Dies wird am besten von einigen der bemerkenswerten Python-Entwickler auf dieser Site beantwortet.
Dennoch möchte ich kommentieren: Wenn ich über die Geschwindigkeit interpretierter Sprachen spreche, zeige ich gerne auf ein Projekt, das an diesem Ort gehostet wird : Computer Language Benchmarks Game
Es ist eine Seite, die sich dem Ausführen von Benchmarks widmet. Es sind bestimmte Aufgaben zu erledigen. Jeder kann eine Lösung in seiner bevorzugten Sprache einreichen, und dann vergleichen die Tests die Laufzeit jeder Lösung. Lösungen können von Experten begutachtet werden, werden häufig von anderen weiter verbessert und die Ergebnisse werden anhand der Spezifikation überprüft. Auf lange Sicht ist dies das fairste Benchmarking-System zum Vergleich verschiedener Sprachen.
Wie Sie aus indikativen Zusammenfassungen wie dieser sehen können , sind kompilierte Sprachen im Vergleich zu interpretierten Sprachen recht schnell. Der Unterschied liegt jedoch wahrscheinlich nicht so sehr in der genauen Art der Kompilierung, sondern in der Tatsache, dass Python (und die anderen im Diagramm langsamer als Python) vollständig dynamisch sind. Objekte können im laufenden Betrieb geändert werden. Typen können im laufenden Betrieb geändert werden. Daher muss einige Typprüfung auf die Laufzeit verschoben werden, anstatt auf die Kompilierungszeit.
Während Sie über die Vorteile des Compilers streiten können, müssen Sie berücksichtigen, dass es verschiedene Funktionen in verschiedenen Sprachen gibt. Und diese Funktionen können zu einem intrinsischen Preis kommen.
Wenn es um Geschwindigkeit geht: Meistens ist es nicht die Sprache und die wahrgenommene Langsamkeit einer Sprache, die das Problem verursacht, sondern ein schlechter Algorithmus. Ich musste nie die Sprache wechseln, weil eine zu langsam war: Wenn mein Code ein Geschwindigkeitsproblem aufweist, behebe ich den Algorithmus. Wenn Ihr Code jedoch zeitaufwändige, rechenintensive Schleifen enthält, lohnt es sich normalerweise, diese neu zu kompilieren. Ein prominentes Beispiel sind in C codierte Bibliotheken, die von Skriptsprachen verwendet werden (Perl XS-Bibliotheken oder zB numpy / scipy für Python, lapack / blas sind Beispiele für Bibliotheken, die mit Bindungen für viele Skriptsprachen verfügbar sind).
quelle
Wenn Sie JIT wie im Just-in-Time-Compiler für eine Bytecode-Darstellung meinen, dann hat es eine solche Funktion (seit 2.2). Wenn Sie JIT für Maschinencode meinen, dann nein. Die Kompilierung zu Bytecode bietet jedoch eine erhebliche Leistungsverbesserung. Wenn Sie möchten, dass es zu Maschinencode kompiliert wird, ist Pypy die Implementierung, nach der Sie suchen.
Hinweis: pypy funktioniert nicht mit Python 3.x.
quelle
Wenn Sie nach Geschwindigkeitsverbesserungen in einem Codeblock suchen, sollten Sie sich rpythonic ansehen , das mit pypy auf C kompiliert wird. Es wird ein Dekorator verwendet, der es in eine JIT für Python konvertiert.
quelle