web-dev-qa-db-ja.com

Pythonブラウザ内:Brython、PyPy.js、Skulpt、Transcryptのいずれを選択するか?

ブラウザでPythonをコーディングできるようになりました。これらは主な候補です(見落としている可能性があるものを追加してください):

しかし、それらを選択する方法は?私が見ることができる唯一の明らかな違いは、SkulptがPython 2に基づいているのに対して、BrythonはPython 3。

注:これは推奨事項や意見のリクエストではありません。教養のある選択を知らせる客観的な事実を探しています。

66
P i

Brython対Transcrypt(2016年7月、TranscryptはOPによってこの質問のオプションとして追加されたため)のいくつかの情報は、数か月前にBrythonでプロジェクトを開始し、Transcryptに移動することで収集されました(先週移動完了)。私はBrythonとTranscryptが好きで、両方の使用法を見ることができます。

これが初めての人には、BrythonとTranscryptの両方が 'transpile' python javascriptへの入力(編集:Brythonを 'a Python =スタンドアロンのJavaScriptを生成しないため、「ブラウザの実装」。両方ともPython 3の構文が必要です。Brythonには、相当数のPython標準ライブラリと一部はウェブ関連のものを処理するためのものですが、Transcryptはそれをほとんど回避し、代わりにJavaScriptライブラリを使用することを提案します。

BrythonGithub )ブラウザーで変換を行うことができます。したがって、pythonと記述すると、brython.jsエンジンは、ページがロードされたときにその場でjavascriptに変換します。これは本当に便利で、思っているよりはるかに高速です。ページに含める必要のあるbrython.jsエンジンは約500Kbです。また、XHRリクエストで個別の.jsファイルを取得することでBrythonが処理する標準ライブラリをインポートする問題があります。一部のライブラリは既にbrython.jsにコンパイルされています。すべてのインポートが新しいファイルを取り込むわけではありませんが、多くのインポートを使用すると、処理が遅くなる可能性がありますが、これを回避する方法があります。ブラウザ開発ツールのネットワークタブをチェックして、ページが読み込まれたら、プロジェクトが使用していないすべてのファイルをBrython srcフォルダーのコピーから削除し、Brythonに含まれるスクリプトを実行します(Brython/www/scripts/make_VFS.pyにあると思います)使用可能なすべてのライブラリをpy_VFS.jsという1つのファイルにまとめて、htからリンクする必要がありますml。通常、1つの巨大な2MB +ファイルが作成されますが、使用していないものを削除すると、非常に小さくなります。このようにすると、brython.js、py_VFS.js、およびpythonコードを取得するだけで、追加のXHRリクエストは不要になります。

TranscryptGithub )一方、 python 3パッケージ として配布されます。手動で使用するか、ツールチェーンにフックして、事前にpythonをjavascriptにコンパイルします。Transcryptでは、pythonで記述し、pythonに対してtranscryptを実行すると、リンク可能なjavascriptを吐き出します。あなたのプロジェクト。出力を制御するという点でも、従来のコンパイラに似ています。たとえば、ES6またはES5にコンパイルするか、ソースマップを出力するかを選択できます(デバッグ中にブラウザで直接表示できます)対応するpythonコード、生成されたjavascriptコードの内部)Transcryptのjavascript出力は非常に簡潔です(または別の言い方をすれば、かなり簡潔です)。私の場合は150kBのpythonは165kBの縮小されていないES5 javascriptに変換されます。比較として、私のプロジェクトのBrythonバージョンは変換後に約800Kbを使用しました。

ただし、Transcryptsの簡潔さの利点を得るには、ドキュメントを少し読む必要があります(本当に少しだけ)。たとえば、Transcryptでは、dict、set、listなどのデータ構造に対するPythonの「真偽」はデフォルトでは有効になっておらず、型チェックに関連する潜在的なパフォーマンスの問題のため、グローバルに有効にすることは推奨されていません。わかりやすくするために:CPythonでは、空のdict、set、またはlistの真理値はFalseですが、Javascriptでは「true」と見なされます。例:

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

これに対処するには、少なくとも3つの方法があります。

  • pythonをjavascriptに変換するときに-tフラグを使用します。例:$ transcrypt -t python.py(推奨されませんが、内部ループで何度も真実性をチェックしない限り、おそらく問題ではありません。パフォーマンスに敏感なコード..)
  • コード内で__pragma__(tconv)または__pragma__(notconv)を使用して、pythonのような真理値への自動変換をローカルで有効にするようにtranscryptコンパイラーに指示します。
  • 真理値をチェックする代わりに、len(myList)> 0 ...をチェックするだけで問題を完全に回避できます。たぶんほとんどの状況でこれで問題ないでしょう。

そうです、私のプロジェクトは大きくなり、パフォーマンスを向上させるためにプリコンパイルしたかったのですが、Brythonでそれを行うのは困難でした(技術的には可能ですが、 online editor javascriptボタンをクリックして出力を確認します)。私はそれを行い、project.htmlから生成されたjavascriptにリンクしましたが、何らかの理由で機能しませんでした。また、Brythonからのエラーメッセージを理解するのは難しいので、このステップが失敗した後、どこから始めればよいかわかりませんでした。また、出力されるコードのサイズとブライトンエンジンのサイズが、私を悩ませ始めていました。だから、すぐに始める方法を教えてくれる簡潔な指示を好むので、最初はより高いグレードのように見えたTranscryptを詳しく見ることにしました(これらはその後追加されました)。

Python3.5のインストール後にセットアップする主なものは次のとおりです。

  1. Python3.5プロジェクトフォルダーを設定するには、venv(各プロジェクトに使用するスペースが少ないvirtualenvの新しいビルトインバージョンのようなもの)を使用します(タイプ:python3.5 -m venv foldername- buntuの回避策3.5 )のパッケージの問題。これにより、特にbinサブフォルダーを持つ 'foldername'が作成されます。
  2. Transcryptのインストールpython package with pip( 'foldername/bin/pip install tr​​anscrypt'))foldername/lib/python3.5/site-packages/transcryptにインストールします。
  3. 毎回foldername/bin/python3.5へのフルパスを入力する必要がない場合は、activate現在のターミナル。 「source foldername/bin/activate」と入力してアクティベートします
  4. コードを記述し、テストのためにJavaScriptにコンパイルし始めます。コードを記述するフォルダー内からコンパイルします。たとえば、foldername/www/projectを使用しました。したがって、そのフォルダーにCDを挿入して、「transcrypt -b your_python_script.py」を実行します。これにより、出力が___javascript___というサブフォルダーに配置されます。その後、htmlから出力されたjavascriptにリンクできます。

移動の主な問題

私にはかなり単純なニーズがあるので、あなたの走行距離は変わるかもしれません。

  • Brythonまたはpython standard libsをjavascript libsで置き換える必要があります。たとえば、 'import json'はBrythonによって提供されますが、Transcryptではjavascript libを使用するか、JSON.parse /を使用できます。 Pythonコードに直接JSON.stringify。あなたのpythonコードにJavascriptライブラリの縮小版を直接含めるには、この形式を使用します(三重引用符に注意してください) :

    ___pragma__ ('js', '{}', '''
    // javascript code
    ''')
    _
  • Brythonのhtml固有の機能は、明らかにTranscryptでは機能しません。通常のjavascriptの方法を使用してください。例:1)Brythonでは、 'document [' id ']'を使用して特定のHTMLタグを参照している可能性がありますが、Transcryptでは 'document.getElementById(' id ')を使用します(これは同じ方法です) javascriptから)。 2) 'del nodeName'(bcはブライトン関数です)を使用してノードを削除することはできません。 「node.parentNode.removeChild(node)」のようなものを使用します。 3)brythonのすべてのDOM関数をJavaScriptの代替に置き換えます。例えばclass_name = className; text = textContent; html = innerHTML;親= parentNode; children = childNodesなど。古いブラウザに必要な代替を含むものが必要な場合は、そのためのJavaScriptライブラリがあります。 4)Brythonのset_timeoutはjavascripts setTimeoutに置き換えられます。5)BR()などのBrythonのhtmlタグは、通常のjavascriptの方法を使用して、<= dom操作構文を使用した場所をすべてやり直す必要があります。 innerHTMLとしてプレーンテキストマークアップを挿入するか、javascript構文を使用して要素を作成し、通常のjavascript DOM構文を使用して要素を添付します。また、チェックボックスについては、brythonは「if checkbox = 'checked':」を使用しますが、Transcryptは「if checkbox:」に満足しています。

  • 先週、2700行のプロジェクトの移動を完了しましたが、その時点でTranscryptはいくつかの小さなことをサポートしていませんでした(フィラーに置き換えるのは簡単でしたが)、これらは1)str.lower、str.split(str。 splitは存在しますが、javascript splitのようです。これは、pythonバージョン、私が依存していた動作)、2)ラウンド(これは、 devバージョン)と3)isinstanceはstr、int、floatでは機能せず、dict、list、setでのみ機能しました。 4)Brythonとの別の違いは、dictのJSON表現を取り込む場合、「myDict = dict(data)」を使用して行う必要があることですが、brythonは「myDict = data」に満足していました。しかし、それはBrythonのjson.loadsの何かに関連している可能性があり、これをJSON.parseに直接置き換えました。 5)また、Transcrypts演算子のオーバーロードが特に有効になっていない場合(グローバルには-oスイッチを、ローカルには__pragma__('opov')を使用)、オーバーロード形式を使用したセット操作のようなことはできませんが、対応する関数を使用する必要があります。例えば。

    _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)また、デフォルトで 'for i in dict:'を使用してdictを反復することはできません。それを有効にせずに(cmd line -iまたは__pragma__('iconv')を使用できますが、 keys()メンバー例:

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

要約するには

  • Brythonが好きなのは、Brythonを使い始めてコードをテストするのが簡単だからです(F5だけです)。これはtrueに近いpython標準ライブラリのほとんどがそこにあるためです。私は、翻訳エンジンを含める必要が嫌いです(編集:または、python = VM)ブラウザーで、出力された大きなJavaScriptサイズを処理する必要がある場合(ただし、まだBrythonを使用している場合)、javascriptメソッドを使用してDOMをbrythonから操作できます(これは可能です)。私のニーズが変わったときに無駄な時間が別のトランスパイラーに移動するため、ブライソンの方法にあまり頼っています。

  • Transcryptが好きなのは、出力されたjavascriptが本当に「無駄のない」ものであり、ブラウザ側にロードするのは、サイズがpythonコードに似ている生成されたjavascriptコードだけだからです。ソースマップをサポートしており、出力されたjavascriptを制御できるため、最適化について多くのことを学びました。

これらのどれが彼らの特定のプロジェクトにとって良いかもしれないかを誰かが見るのを助けることを願っています。

54
fzzylogic

私はpypyjsと同様にskulptを使用してコミットしました。そして、これらはすべて非常に異なっているので、あなたが私に尋ねると、どんな比較でも意味がありません。

それはあなたが探しているものに依存し、どちらが最も理にかなっています。

PyPyJS

pypyjsは巨大で、pypy仮想マシン全体を含む12MBのjavascriptファイルです。したがって、python実装の完全性が必要な場合、これがあなたの赤ちゃんです。それは本当にうまく機能するjavascriptブリッジを持っていますが、pythonでjavascriptウェブサイトのコードを書くための実行可能なオプションではありません。ただし、import compilerは許可されます。

これはemscriptenで構築されており、pystoneベンチマークの実行においてfasterよりもCPythonの方が優れています。

私はpypyjsについて短い話をしました こちら はスライドです。

スカルプト

ティーチングツールであり(または時間の経過とともに進化してきました)、pythonをcpythonコンパイラーを非常に厳密にエミュレートするステートマシンにコンパイルします。コアとなるのは、javascriptのpythonコンパイラーの手書き実装です。これにより、非同期実行が可能になります。

while (True):
    print "hi"

ブラウザをロックせずに。

Skulptは、非同期継続をサポートする唯一のものであり、発生する非同期の問題を解決している間、pythonの実行を一時停止できます。この作業を行う:

from time import sleep
sleep(1)

Pystoneを比較すると、SkulptはCPythonの約10分の1の速度で実行されます。

ブライソン

@ olemis-langがこれを拡張できる可能性があります。しかし、Brythonはpy3であり、その他はpy2であるという明らかな違いの次にあります。ブライソンはトランスパイラーでもあります。

Time.clockが実装されていないため、Brythonはpystoneベンチマークを実行しません。公式にはハードウェア関数であるためです。

12
albertjan

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

このページでは、3つの候補のベンチマークを行います。 Brythonは明確な勝者として浮上します。

S.O.を説明する「ヘルプ」にもかかわらずこの種の質問には適していませんが、この場合、簡潔な回答が可能です。

人々はあまりにも急いでいるのでしょうか?

10
P i

まず私はブライソンコミッターです。それにもかかわらず、客観的な評価をするためにできるだけ公平になるようにします。

前回使用したとき、Skulptはジェネレータ式などの機能をサポートしていませんでした。 BrythonとPyPy.jsはそうするので、機能レベルIMHOでは後者が優れています。

Brython(現時点では)はまだ進行中です。一部のモジュールはインポートできません(例 xml.ElementTree )。それにもかかわらず、標準との完全な互換性を達成しているにもかかわらず(少なくとも理にかなっている場合)CPythonテストスイート全体の実行に取り組んでいるので、この状況は変わり始めています。

Brythonは、モジュールのインポートを高速化するために.vfs.jsもサポートしています。

PyPy.jsには、PyPy(JITコンパイル、十分にテストされた、...)を搭載しているという事実からわかりやすい多くの特性がありますが、ブラウザーでの実行に適しているかどうかはわかりません。これは、プロジェクトが進化するにつれて変化する可能性があります。

TODO:信頼できるベンチマークで回答を補完しようとします。

6
Olemis Lang

ここではRapydScriptまたはRapydScript-NGについて言及していません。 GlowScript VPython(glowscript.org)で使用される非常に効率的なJavaScriptコードを生成します。以前はAlex TsepkovのオリジナルのRapydScriptを使用していました( https://github.com/atsepkov/RapydScript )が、最近Kovid GoyalのRapydScript-NGに切り替えました( https:// github .com/kovidgoyal/rapydscript-ng )。最近、CPython、RapydScript、およびBrythonでpystoneベンチマークを実行しました。結果は次のとおりです。

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

5
user1114907

誰もそれについて言及していないので、私は言及する価値があると思いました Batavia Pythonプリコンパイルを実行するための仮想マシンPythonバイトコード。

試してみたところ、興味深いコンセプトではありますが、ドキュメントがほとんどないため、まだ初期段階です。

最終的には、何をしようとしているかによって異なります。私はTranscryptを選択しました。これは、実用的でパフォーマンスが良く、最近リリース/保守されたためです。

4
icarito

これは、現在市場で利用可能なすべてのオプションを比較する更新された会議です。

https://www.youtube.com/watch?v=2XSeNQyPlTY

スピーカーは、この地域でよく知られている開発者であるRussell Keith-Mageeです。

2
Daian Gan