Python im Browser: Wie wähle ich zwischen Brython, PyPy.js, Skulpt und Transcrypt?


86

Ich bin sehr gespannt, dass es jetzt möglich ist, Python im Browser zu codieren. Dies sind die Hauptkandidaten (bitte fügen Sie alle hinzu, die ich möglicherweise übersehen habe):

Aber wie soll man zwischen ihnen wählen? Der einzige offensichtliche Unterschied, den ich sehen kann, ist, dass Skulpt auf Python 2 basiert, während Brython auf Python 3 basiert.

Bitte beachten Sie: Dies ist keine Anfrage nach Empfehlungen oder Meinungen. Ich suche objektive Fakten, die eine fundierte Entscheidung beeinflussen würden.


6
Die Aufforderung, die beste Bibliothek für etwas zu empfehlen, ist einer der Fälle, für die in der Hilfe ausdrücklich erklärt wird, dass StackOverflow nicht geeignet ist. Es ist eine großartige Frage, nur nicht für das Format dieser Site. Sie möchten wahrscheinlich etwas Diskussionsbasiertes wie eine Mailingliste oder ein Forum.
Abarnert

2
Transcrypt ( transcrypt.org ) compiliert aus einer großen Untergruppe von python3.5 inc. Mehrfachvererbung, generiert schnellen (Call Memoizing), kleinen, lesbaren Code, unterstützt mehrstufige Quellkarten und kann jede JS-Bibliothek ohne Anpassung verwenden. Haftungsausschluss: Ich habe es geschrieben.
Jacques de Hooge

1
Hallo fzzylogic, ich habe das Tag hinzugefügt, damit die Leute jetzt Fragen zu SO stellen können, wenn sie es verwenden. Ersetzte das JS-Tag durch dieses, da es am wenigsten wahrscheinlich ist, wenn Sie Python lieber im Browser verwenden möchten.
Jacques de Hooge

1
Ich habe eine Art Tutorial für Transcrypt für Anfänger geschrieben. Sie können es unter github.com/bunkahle/Transcrypt-Examples/blob/master/alerts/… und github.com/bunkahle/Transcrypt-Examples/blob/master/cookies/…
bunkus

1
Gelöschte Antwort von dstromberg mit 27 Upvotes hat einen schönen Vergleichslink: stromberg.dnsalias.org/~strombrg/pybrowser/python-browser.html
Cees Timmerman

Antworten:


21

Das Ausführen von Python im Browser ist ein wirklich guter und aktueller Artikel (Stand 2019), der Brython, Skulpt, PyPy.js, Transcrypt, Pyodide und Batavia vergleicht . Ich kann es nur empfehlen.

Eine gute Zusammenfassung finden Sie in den folgenden Bildern.

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein


60

Hier einige Informationen zu Brython vs Transcrypt (Juli 2016, da Transcrypt vom OP als Option zu dieser Frage hinzugefügt wurde), die durch den Start eines Projekts mit Brython vor einigen Monaten und den Wechsel zu Transcrypt (Abschluss des Umzugs letzte Woche) gewonnen wurden. Ich mag Brython und Transcrypt und kann Verwendungen für beide sehen.

Für Neueinsteiger "transpilieren" Brython und Transcrypt beide Python-Eingaben in Javascript (Bearbeiten: Vielleicht ist es besser, Brython als "Python-Implementierung für den Browser" anzusehen, da es kein eigenständiges Javascript erzeugt). Beide erfordern die Python 3-Syntax. Brython enthält eine beträchtliche Anzahl von Python-Standardbibliotheken und einige eigene für den Umgang mit webbezogenen Dingen, während Transcrypt dies größtenteils vermeidet und stattdessen die Verwendung von Javascript-Bibliotheken vorschlägt.

Brython ( Github) kann die Konvertierung im Browser durchführen. Sie schreiben also in Python und die brython.js-Engine konvertiert es im laufenden Betrieb in Javascript, wenn die Seite geladen wird. Dies ist sehr praktisch und viel schneller als Sie vielleicht denken. Die brython.js-Engine, die Sie in Ihre Seiten aufnehmen müssen, ist jedoch ungefähr 500 KB groß. Es geht auch darum, Standardbibliotheken zu importieren, die Brython durch Abrufen separater JS-Dateien mit XHR-Anforderungen erledigt. Einige Bibliotheken sind bereits in brython.js kompiliert, sodass nicht bei jedem Import neue Dateien abgerufen werden. Wenn Sie jedoch viele Importe verwenden, kann es langsam werden. Es gibt jedoch Möglichkeiten, dies zu umgehen. Ich habe auf der Registerkarte "Netzwerk" in den Browser-Entwicklungstools überprüft, welche Dateien beim Laden der Seite abgerufen wurden, und dann alle Dateien gelöscht, die mein Projekt nicht in einer Kopie des Brython src-Ordners verwendet hat. und führen Sie das in Brython enthaltene Skript aus (ich glaube, es befindet sich in Brython / www / scripts / make_VFS.py), das alle verfügbaren Bibliotheken in einer Datei namens py_VFS.js kompiliert, auf die Sie auch von Ihrem HTML-Code aus verlinken müssen. Normalerweise wird eine riesige Datei mit mehr als 2 MB erstellt. Wenn Sie jedoch die Dinge löschen, die Sie nicht verwenden, kann dies sehr klein sein. Wenn Sie dies auf diese Weise tun, müssen Sie nur brython.js, py_VFS.js und Ihren Python-Code abrufen, und es werden keine zusätzlichen XHR-Anforderungen benötigt.

Transcrypt ( Github ) wird dagegen als Python 3-Paket vertriebendie Sie manuell verwenden oder in Ihre Toolchain einbinden können, um Python im Voraus in Javascript zu kompilieren. Mit Transcrypt schreiben Sie also in Python, führen Transcrypt für Python aus und es spuckt Javascript aus, auf das Sie in Ihrem Projekt verlinken können. Es ähnelt eher einem herkömmlichen Compiler, da es eine gewisse Kontrolle über die Ausgabe bietet. Sie können beispielsweise wählen, ob Sie mit ES6 oder ES5 kompilieren oder Sourcemaps ausgeben möchten (während des Debuggens führt der Browser Sie direkt zum entsprechenden Python-Code anstelle des generierten Javascript-Codes.) Die Javascript-Ausgabe von Transcrypt ist ziemlich knapp ( oder anders ausgedrückt, es ist hübsch und knapp). In meinem Fall werden 150 KB Python in 165 KB nicht minimiertes ES5-Javascript konvertiert. Zum Vergleich: In der Brython-Version meines Projekts wurden nach der Konvertierung ca. 800 KB verwendet.

Um jedoch die Vorteile der Knappheit von Transcrypts nutzen zu können, müssen Sie die Dokumente ein wenig lesen (wirklich nur ein bisschen). Beispielsweise ist bei Transcrypt die "Wahrhaftigkeit" von Python für Datenstrukturen wie "diktieren", "setzen" und "auflisten" nicht standardmäßig aktiviert, und die globale Aktivierung wird aufgrund potenzieller Leistungsprobleme im Zusammenhang mit Typüberprüfungen nicht empfohlen. Zur Verdeutlichung: Unter CPython hat ein leeres Diktat, eine leere Menge oder eine leere Liste den Wahrheitswert False, während sie in Javascript als "wahr" betrachtet wird. Beispiel:

myList = []
if myList:    # False in CPython bcs it's empty, true in javascript bcs it exists
    # do some things.

Es gibt mindestens drei Möglichkeiten, dies zu beheben:

  • Verwenden Sie das Flag -t, wenn Sie Python in Javascript konvertieren, z. B.: $ Transcrypt -t python.py (nicht empfohlen, aber wahrscheinlich kein Problem, es sei denn, Sie überprüfen die Richtigkeit in inneren Schleifen von leistungsempfindlichem Code mehrmals.)
  • Verwenden Sie __pragma__(tconv)oder __pragma__(notconv)in Ihrem Code, um den Transcrypt-Compiler anzuweisen, die automatische Konvertierung in pythonähnliche Wahrheitswerte lokal einzuschalten.
  • Anstatt nach dem Wahrheitswert zu suchen, vermeiden Sie das Problem insgesamt, indem Sie nur len (myList)> 0 überprüfen ... Vielleicht ist das in den meisten Situationen in Ordnung, erledigt den Job für meinen leichten Gebrauch.

Richtig, mein Projekt wurde also größer und ich wollte vorkompilieren, um einen Leistungsgewinn zu erzielen, aber es fiel mir schwer, dies mit Brython zu tun (obwohl es technisch möglich ist, ist es einfach, den Online-Editor zu verwenden und auf die Javascript-Schaltfläche zu klicken, um zu sehen die Ausgabe). Ich habe das getan und mit dem generierten Javascript aus project.html verlinkt, aber es hat aus irgendeinem Grund nicht funktioniert. Außerdem fällt es mir schwer, Fehlermeldungen von Brython zu verstehen, sodass ich nicht wusste, wo ich anfangen soll, nachdem dieser Schritt fehlgeschlagen ist. Auch die große Größe des ausgegebenen Codes und die Größe der Brython-Engine begannen mich zu nerven. Deshalb habe ich mich für Transcrypt entschieden, das zunächst eine höhere Qualität zu haben schien, da ich lieber dumme Anweisungen bevorzuge, die mir sagen, wie ich sofort anfangen soll (diese wurden inzwischen hinzugefügt).

Die Hauptsache nach der Installation von Python3.5 war:

  1. Verwenden Sie venv (es ist wie eine neue integrierte Version von virtualenv, die weniger Speicherplatz für jedes Projekt benötigt), um einen python3.5-Projektordner einzurichten (geben Sie einfach Folgendes ein: python3.5 -m venv-Ordnername - Problemumgehung für Ubuntu mit Paketproblemen für 3.5 ). Dies macht unter anderem 'Ordnername' mit einem bin-Unterordner.
  2. Installieren Sie das Transcrypt-Python-Paket mit pip ('Ordnername / bin / pip-Installation transcrypt'), das es unter dem Ordnernamen / lib / python3.5 / site-packages / transcrypt installiert.
  3. activatedas aktuelle Terminal, wenn Sie nicht jedes Mal den vollständigen Pfad zu Ordnername / bin / python3.5 eingeben müssen. Aktivieren Sie durch Eingabe von: 'Quellordnername / bin / enable'
  4. Beginnen Sie mit dem Schreiben von Code und kompilieren Sie ihn zum Testen in Javascript. Kompilieren Sie aus dem Ordner, in den Sie Ihren Code schreiben. Zum Beispiel habe ich den Ordnernamen / www / project verwendet. Legen Sie also eine CD in diesen Ordner und führen Sie Folgendes aus: 'Transcrypt -b your_python_script.py'. Dadurch wird die Ausgabe in einen Unterordner namens aufgerufen__javascript__ . Sie können dann von Ihrem HTML-Code aus auf das ausgegebene Javascript verlinken.

Hauptthemen, die sich bewegen

Ich habe ziemlich einfache Bedürfnisse, daher kann Ihr Kilometerstand variieren.

  • Sie müssen Brython- oder Python-Standardbibliotheken durch Javascript-Bibliotheken ersetzen. So wird beispielsweise 'import json' von Brython bereitgestellt, aber unter Transcrypt können Sie eine Javascript-Bibliothek verwenden oder einfach JSON.parse / JSON.stringify direkt in Ihrem Python-Code verwenden. Verwenden Sie dieses Format, um eine verkleinerte Version einer Javascript-Bibliothek direkt in Ihren Python-Code aufzunehmen (beachten Sie die dreifachen Anführungszeichen):

    __pragma__ ('js', '{}', '''
    // javascript code
    ''')
  • Brythons HTML-spezifische Funktionen funktionieren offensichtlich nicht mit Transcrypt. Verwenden Sie einfach die normalen Javascript-Methoden. Beispiele: 1) Unter Brython haben Sie möglicherweise mit 'document [' id ']' auf ein bestimmtes HTML-Tag verwiesen, aber mit Transcrypt würden Sie 'document.getElementById (' id ') verwenden (genau wie Sie) es aus Javascript). 2) Sie können einen Knoten nicht mit 'del nodeName' löschen (bcs, das ist eine Brython-Funktion). Verwenden Sie so etwas wie 'node.parentNode.removeChild (node)'. 3) Ersetzen Sie alle DOM-Funktionen von brython durch die Javascript-Alternativen. zB Klassenname = Klassenname; text = textContent; html = innerHTML; parent = parentNode; Kinder = Kinderknoten usw. Ich denke, wenn Sie etwas benötigen, das Alternativen enthält, die von einigen älteren Browsern benötigt werden, dann gibt es dafür Javascript-Bibliotheken. 4) Brythons set_timeout wird durch Javascripts ersetzt setTimeout 5) Brythons HTML-Tags wie BR () müssen auf die normale Weise mit Javascript ersetzt werden und alle Stellen, an denen Sie die Syntax <= dom manipulation verwendet haben, werden wiederholt. Fügen Sie entweder Nur-Text-Markups als innerHTML ein oder erstellen Sie die Elemente mithilfe der Javascript-Syntax und hängen Sie sie dann mit der normalen Javascript-DOM-Syntax an. Mir ist auch aufgefallen, dass brython für Kontrollkästchen "if checkbox = 'check':" verwendet, Transcrypt jedoch mit "if checkbox:" zufrieden ist. Fügen Sie entweder Nur-Text-Markups als innerHTML ein oder erstellen Sie die Elemente mithilfe der Javascript-Syntax und hängen Sie sie dann mit der normalen Javascript-DOM-Syntax an. Mir ist auch aufgefallen, dass brython für Kontrollkästchen "if checkbox = 'check':" verwendet, Transcrypt jedoch mit "if checkbox:" zufrieden ist. Fügen Sie entweder Nur-Text-Markups als innerHTML ein oder erstellen Sie die Elemente mithilfe der Javascript-Syntax und hängen Sie sie dann mit der normalen Javascript-DOM-Syntax an. Mir ist auch aufgefallen, dass brython für Kontrollkästchen "if checkbox = 'check':" verwendet, Transcrypt jedoch mit "if checkbox:" zufrieden ist.

  • Ich habe letzte Woche ein 2700-Zeilen-Projekt fertiggestellt. Zu diesem Zeitpunkt hatte Transcrypt keine Unterstützung für ein paar Kleinigkeiten (obwohl sie leicht durch Füllstoffe zu ersetzen waren). Dies waren 1) str.lower, str.split (str. split ist vorhanden, scheint aber der Javascript-Split zu sein, der anders funktioniert als die Python-Version, auf deren Verhalten ich mich verlassen habe), 2) round (dies scheint jetzt in der Dev-Version unterstützt zu werden) und 3) isinstance didn Arbeiten Sie nicht mit str, int und float, sondern nur mit dict, list und set. 4) Ein weiterer Unterschied zu Brython, den ich bemerkt habe, ist, dass ich, wenn ich eine JSON-Darstellung eines Diktats eingebe, dies mit 'myDict = dict (data)' tun muss, während brython mit 'myDict = data' zufrieden war. Aber das könnte mit etwas in Brythons json.loads zusammenhängen, das ich direkt durch JSON.parse ersetzt habe.__pragma__('opov')für local) können Sie keine Set-Operationen mit dem überladenen Format ausführen, sondern müssen die entsprechenden Funktionen verwenden. Z.B

    a = set([1, 2, 3])
    b = set([3, 4, 5])
    a.difference(b)             # is used instead of a - b
    a.union(b)                  # used instead of a | b
    a.intersection(b)           # used instead of a & b
    a.symmetric_difference(b)   # used instead of a ^ b

6) Sie können Diktate auch nicht standardmäßig mit 'for i in dict:' iterieren, ohne dies zu aktivieren (cmd line -i oder __pragma__('iconv'), aber Sie können vermeiden, dass Sie es aktivieren müssen, indem Sie nur das Mitglied keys () verwenden, z.

for key, value in dict.items():
    # do things for each key and value..

Zusammenfassen

  • Ich mag Brython, weil es einfach ist, damit loszulegen und Ihren Code zu testen (nur F5). Es ist näher an echtem Python, weil der größte Teil der Standardbibliothek vorhanden ist. Ich mag es nicht, die Transpilations-Engine (Bearbeiten: Oder man könnte sie als Python-VM betrachten) in den Browser und die große ausgegebene Javascript-Größe aufnehmen zu müssen. Wenn ich Dinge überarbeiten müsste (aber immer noch Brython verwenden würde), hätte ich Javascript-Methoden verwendet, um das DOM von Brython aus zu manipulieren (was Sie tun können ..), anstatt mich so sehr auf die Brython-Methoden zu stützen, weil dies Zeitverschwendung verschwendete zu einem anderen Transpiler, wenn sich meine Bedürfnisse geändert haben.

  • Ich mag Transcrypt, weil das ausgegebene Javascript wirklich "schlank und gemein" ist und weil das einzige, was Sie auf der Browserseite laden, Ihr generierter Javascript-Code ist, dessen Größe Ihrem Python-Code ähnelt. Auch weil es Sourcemaps unterstützt und weil es mir ein gewisses Maß an Kontrolle über das ausgegebene Javascript gibt. Und damit habe ich einiges über Optimierung gelernt.

Ich hoffe, das hilft jemandem zu erkennen, welche davon für sein bestimmtes Projekt gut sein könnten.


1
Bist du sicher, dass Brython ein Transpiler ist? Ich bin mir ziemlich sicher, dass es einen Python-Interpreter in JavaScript implementiert. Wenn es ein Transpiler wäre, müssten Sie ihn nicht mit Ihrer App bündeln.
Carl Smith

@ Carl Smith Interessanter Punkt, hatte nicht so darüber nachgedacht. Brython konvertiert den Python-Code in Javascript, aber da Javascript keinen Standard-Bytecode hat, könnte man das generierte Javascript möglicherweise als 'Bytecode' für die Brython-Engine anzeigen.
Fzzylogic

1
Du hast mich misverstanden. Ich glaube nicht, dass Brython Python in JavaScript umwandelt. Es implementiert lediglich einen Python-Interpreter in JS anstelle von C. Laut GitHub README "Brython (Browser Python) ist eine Implementierung von Python 3, die im Browser ausgeführt wird und über eine Schnittstelle zu den DOM-Elementen und -Ereignissen verfügt".
Carl Smith

4
@jsbueno Derzeit sind Seed, Randint, Choice und Random verfügbar, die nur als Ausgangspunkt dienen. Eigentlich hoffen wir, dass jemand es aufnimmt und vervollständigt, so wie es für re getan wurde, was ganz oben auf unserer Liste stand. Sollte nicht so schwer sein. Die Anzahl der Bibliotheken ist gewachsen, aber Beiträge sind sehr willkommen. Während der Akzent weiterhin auf der Verwendung von JS-Bibliotheken liegt, würde ich persönlich mehr Standardlibs begrüßen.
Jacques de Hooge

1
Ein schöner Überblick. Insgesamt sehe ich den Hauptunterschied (den Sie angeben, aber nicht betonen) darin, dass Brythons Ziel darin besteht, Sie Python im Browser verwenden zu lassen, während Transcrypt anscheinend das Ziel hat, dass Sie Python-Syntax zum Schreiben von JavaScript verwenden. Dies bedeutet, dass Transcrypt bereit ist, Dinge wie den Wahrheitsunterschied zu tun, der auf einer grundlegenden Ebene von der Python-Semantik abweicht, und auch auf Code abzielt, der JavaScript-Bibliotheken nutzt. Während Brython versucht, Python so genau wie möglich zu replizieren, mit der Idee, dass Sie alles in Python tun.
BrenBarn

12

Ich habe sowohl Skulpturen als auch Pypyjs verwendet und mich dazu verpflichtet. Und sie sind alle drei sehr unterschiedlich, dass jeder Vergleich umstritten ist, wenn Sie mich fragen.

Es hängt davon ab, wonach Sie suchen, was am sinnvollsten ist.

PyPyJS

pypyjs ist riesig, es ist eine 12 MB große Javascript-Datei, die die gesamte virtuelle Pypy-Maschine enthält. Wenn Sie also die Vollständigkeit der Python-Implementierung wünschen, ist dies Ihr Baby. Es hat eine Javascript-Brücke, die wirklich gut funktioniert, aber es ist keine praktikable Option, um Ihren Javascript-Website-Code in Python zu schreiben. Es wird Sie jedoch lassen import compiler.

Es ist mit emscripten gebaut und ist schneller als CPython, wenn es , den Pystone-Benchmark auszuführen.

Ich hielt einen kurzen Vortrag über Pypyjs Hier sind die Folien.

Skulpt

Ist ein Lehrwerkzeug (oder es hat sich im Laufe der Zeit zu diesem entwickelt), kompiliert es Ihre Python in eine Zustandsmaschine, die den cpython-Compiler sehr genau emuliert. Im Kern handelt es sich um eine handschriftliche Implementierung des Python-Compilers in Javascript. Es ermöglicht eine asynchrone Ausführung, mit der Sie Folgendes tun können:

while (True):
    print "hi"

Ohne den Browser zu blockieren.

Skulpt ist die einzige, die asynchrone Fortsetzungen unterstützt. Sie können die Ausführung von Python anhalten, während asynchrone Ereignisse behoben werden. Damit dies funktioniert:

from time import sleep
sleep(1)

Skulpt läuft beim Vergleich von Pystone mit etwa einem Zehntel der Geschwindigkeit von CPython.

Brython

Ich weiß am wenigsten über dieses, vielleicht kann @ olemis-lang dieses erweitern. Aber neben dem offensichtlichen Unterschied, dass Brython py3 und die anderen py2 ist. Brython ist auch ein Transpiler.

Brython führt den Pystone-Benchmark nicht aus, da time.clock nicht implementiert ist, da es sich offiziell um eine Hardwarefunktion handelt.


PyPyJS-Entwickler haben die Entwicklung gestoppt. Auch die Python3-Unterstützung scheint noch nicht abgeschlossen zu sein. github.com/pypyjs/pypyjs/issues/213 und github.com/pypyjs/pypyjs/issues/172
Roland Pihlakas

Es wird nicht gewartet, aber das bedeutet nicht, dass es nicht funktioniert :) trinket.io/pypyjs, aber sehen Sie sich diesen Bereich an. Ich bin mir ziemlich sicher, dass irgendwann wieder etwas in die Luft sprudeln wird. Sie können auch nicht erwarten, dass Open Source gewartet wird, es sei denn, Sie tun es selbst. :)
Albertjan

Es scheint mir, dass Trinket mit Python 2 auf der Browserseite ausgeführt wird, während Trinket mit Python 3 (und numpy) auf der Serverseite ausgeführt wird. Es ist immer noch beeindruckend, dass es ihnen gelingt, visuelle Darstellungen im Browser zu rendern, obwohl der Code auf der Serverseite ausgeführt wird. Es wäre sehr nützlich zu wissen, wie sie das erreicht haben. Hast du eine Idee?
Roland Pihlakas

Trinket verwendet die GlowScript-Bibliothek (glowscript.org), die RapydScript-NG verwendet, um Python in JavaScript zu transpilieren, und WebGL, um die 3D-Animationen zu erstellen. Sowohl das Transpilieren als auch das Ausführen erfolgen im Browser. Hier ist eine Übersicht über die GlowScript-Architektur: vpython.org/contents/VPythonArchitecture.pdf
user1114907

11

https://brythonista.wordpress.com/2015/03/28/comparing-the-speed-of-cpython-brython-skulpt-and-pypy-js/

Diese Seite bewertet die drei Kandidaten. Brython geht als klarer Sieger hervor.

Trotz der "Hilfe", die erklärt, dass SO für diese Art von Frage nicht gut ist, scheint in diesem Fall eine präzise Antwort möglich zu sein.

Vielleicht sind die Leute zu voreilig?


5
Als ich das letzte Mal Brython überprüft habe, war es keine vollständige Implementierung von Python. Es ist auch nicht klar, wie "am besten" oder "wie man zwischen diesen wählt" gemessen werden sollte. Die schnellste? Python wird meistens nicht für die Geschwindigkeit verwendet. Implementiert die meisten Funktionen / Bibliotheken? Möglicherweise gibt es Module, die Sie niemals in einem Browser verwenden würden. Ist eine zusätzliche (nicht mit cpython kompatible) Syntax für allgemeine Operationen (Baummanipulation) ein Plus oder ein Minus? Ich denke nicht, dass die Leistung in einem Benchmark so bedeutsam ist.
Syntonym

Der Leistungsbenchmark ist ein wichtiger Faktor, wenn er nicht etwa 20 bis 40% schneller ist, sondern bei einigen Vorgängen etwa 1000% verbessert. Brython ist eine leichte Schicht über Javascript, also ist es anders. Außerdem ist das Projekt heutzutage sehr Python3-konform. Es werden einige wenige bekannte und ausgereifte Javascript-Bibliotheken nach Bedarf in das Projekt integriert, beispielsweise für die Verarbeitung großer Ganzzahlen.
Jsbueno

7

Zuallererst bin ich ein Brython-Committer. Trotzdem werde ich versuchen, so unparteiisch wie möglich zu sein, um eine objektive Bewertung vorzunehmen.

Als ich es das letzte Mal benutzte, unterstützte Skulpt keine Funktionen wie Generatorausdrücke. Brython und PyPy.js tun dies, so dass auf der Funktionsebene IMHO die späteren überlegen sind.

Brython (zu diesem Zeitpunkt) ist noch in Arbeit. Einige Module können nicht importiert werden (z. B. xml.ElementTree . ). Trotzdem beginnt sich diese Situation zu ändern, da wir daran arbeiten, die gesamte CPython-Testsuite auszuführen, obwohl wir die vollständige Kompatibilität mit Standards erreicht haben (zumindest wenn dies sinnvoll ist).

Brython unterstützt auch .vfs.js, um den Modulimport zu beschleunigen.

PyPy.js weist eine Reihe von Merkmalen auf, die sich direkt aus der Tatsache ergeben, dass es von PyPy unterstützt wird (JIT-Kompilierung, gut getestet, ...), aber ich bin mir nicht sicher, ob es für die Ausführung im Browser geeignet ist. Dies kann sich im Verlauf des Projekts ändern.

TODO: Ich werde versuchen, meine Antwort durch zuverlässige Benchmarks zu ergänzen.


8
Als Committer für Skulpt kann ich Ihnen sagen, dass es Generatorausdrücke unterstützt. :)
Albertjan

6

Nicht erwähnt ist hier RapydScript oder RapydScript-NG. Sie erzeugen sehr effizienten JavaScript-Code, der in GlowScript VPython (glowscript.org) verwendet wird. Ich habe das ursprüngliche RapydScript von Alex Tsepkov ( https://github.com/atsepkov/RapydScript ) verwendet, bin aber kürzlich zu RapydScript-NG von Kovid Goyal ( https://github.com/kovidgoyal/rapydscript-ng ) gewechselt . Ich habe kürzlich den Pystone-Benchmark für CPython, RapydScript und Brython durchgeführt, und Sie können die Ergebnisse hier sehen:

https://groups.google.com/forum/?fromgroups&hl=de#!topic/brython/20hAC9L3ayE


Können Sie die Ergebnisse zusammenfassen?
Jay

1
Am 18. Juni sagte Pierre Quentel: "Ok, es gibt ein Leistungsproblem, aber die Dinge werden besser. Die Version, an der ich gerade arbeite (3.2.7), führt den Pystone-Test 2.5 schneller als 3.2.6 aus. Es ist immer noch 15 Mal langsamer als CPython, aber in den frühen Tagen war es tausende Male langsamer. "
user1114907

1
Ich habe den Pystones-Benchmark mit dem Rapydscript-ng-Transpiler ausgeführt und er hat die 5-fache Geschwindigkeit von CPython auf meinem Windows 10-Computer gemessen: 600000 Pystones / Sek. Im Vergleich zu 125000 Pystones / Sek. Der Faktor der etwa 5-fachen CPython-Geschwindigkeit für Rapydscript-ng erhöht sich auf die etwa 7-fache CPython-Geschwindigkeit, wenn ich die in GlowScript VPython verwendete Operatorüberladung deaktiviere, bei der beispielsweise a + b in a ["+"] (b) konvertiert wird. ;; Dies geschieht, um eine einfache Manipulation von 3D-Vektoren zu ermöglichen.
user1114907

Ich konnte nicht sagen, dass sich Quentels Kommentar auf Brython bezog.
user1114907

2
Ich habe keine Benchmarks mehr durchgeführt. Ich wechselte zunächst zu RapydScript-NG, als die Entwicklung von RapydScript ins Stocken geriet. Später, als Alex Tsepkov zur Entwicklung zurückkehrte, hatte ich einen Austausch mit ihm, in dem sogar er zustimmte, dass das NG-Projekt von Kovid Goyal für meine besondere Verwendung auf glowscript.org besser geeignet ist. Tsepkov möchte eine gemischte Python / JavaScript-Sprache für Webprogrammierer erstellen, während Goyal die Annäherung an Standard-Python betont und eine gute Unterstützung für das Kompilieren im Browser bietet, die beide für meine Arbeit von entscheidender Bedeutung sind.
user1114907

4

Da es niemand erwähnt hat, dachte ich, dass es sich lohnt, Batavia zu erwähnen, das die virtuelle Python-Maschine zum Ausführen von vorkompiliertem Python-Bytecode implementiert.

Ich habe es gerade ausprobiert und obwohl es ein interessantes Konzept ist, befindet es sich noch in einem frühen Stadium, da es wenig Dokumentation gibt.

Am Ende wird es davon abhängen, was Sie versuchen zu tun. Ich habe mich nach einem Blick für Transcrypt entschieden , weil es pragmatischer und leistungsfähiger war und auch in jüngerer Zeit veröffentlicht / gewartet wurde.


Skulpt wird immer noch aktiv gepflegt und von einer ziemlich großen Benutzerbasis verwendet (mehrere sehr polulare Kurse zu Cousera). Es werden möglicherweise nicht so viele Releases wie Transcrypt veröffentlicht, aber es gibt viel mehr Betreuer, Betreuer, die ein Produkt darauf aufgebaut haben. Sie sind also auf lange Sicht dabei. :)
Albertjan

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.