Saya sangat senang melihat bahwa sekarang mungkin untuk membuat kode Python di browser. Berikut adalah kandidat utama (harap tambahkan yang mungkin telah saya abaikan):
Tapi bagaimana memilih di antara mereka? Satu-satunya perbedaan jelas yang dapat saya lihat adalah Skulpt didasarkan pada Python 2, sedangkan Brython didasarkan pada Python 3.
Harap diperhatikan: Ini bukan permintaan untuk rekomendasi atau opini. Saya mencari fakta obyektif yang akan menginformasikan pilihan terpelajar.
Jawaban:
Menjalankan Python di Browser adalah artikel yang sangat bagus dan terbaru (per 2019) yang membandingkan Brython, Skulpt, PyPy.js, Transcrypt, Pyodide, Batavia . Saya sangat merekomendasikan membacanya.
Ringkasan yang bagus bisa dilihat pada gambar berikut.
sumber
Berikut beberapa info tentang Brython vs Transcrypt (Juli 2016, sejak Transcrypt ditambahkan sebagai opsi pada pertanyaan ini oleh OP), dikumpulkan dengan memulai proyek dengan Brython beberapa bulan yang lalu dan pindah ke Transcrypt (selesai pindah minggu lalu). Saya suka Brython dan Transcrypt dan dapat melihat kegunaan keduanya.
Untuk orang yang baru mengenal ini, Brython dan Transcrypt keduanya 'transpile' input python ke javascript (Sunting: mungkin lebih baik melihat Brython sebagai 'implementasi Python untuk browser' karena tidak menghasilkan javascript mandiri). Keduanya membutuhkan sintaks Python 3. Brython menyertakan sejumlah besar pustaka standar Python dan beberapa di antaranya sendiri untuk menangani hal-hal terkait web, sedangkan Transcrypt menghindarinya untuk sebagian besar dan menyarankan menggunakan pustaka Javascript sebagai gantinya.
Brython ( Github) dapat melakukan konversi di browser. Jadi Anda menulis dengan python dan mesin brython.js mengubahnya menjadi javascript dengan cepat ketika halaman dimuat. Ini sangat nyaman, dan jauh lebih cepat dari yang Anda kira. Namun, mesin brython.js yang perlu Anda sertakan di halaman Anda berukuran sekitar 500Kb. Juga, ada masalah mengimpor pustaka standar, yang ditangani Brython dengan mengambil file .js terpisah dengan permintaan XHR. Beberapa lib sudah dikompilasi menjadi brython.js, jadi tidak setiap impor akan menarik file baru, tetapi jika Anda menggunakan banyak impor, semuanya bisa menjadi lambat. Namun, ada cara untuk mengatasi ini. Apa yang saya lakukan adalah memeriksa tab jaringan di alat pengembang browser untuk melihat file apa yang ditarik saat halaman dimuat, lalu hapus semua file yang tidak digunakan proyek saya dalam salinan folder src Brython, dan jalankan skrip yang disertakan dengan Brython (menurut saya ada di Brython / www / scripts / make_VFS.py) yang mengkompilasi semua lib yang tersedia menjadi satu file bernama py_VFS.js yang juga perlu Anda tautkan dari html Anda. Biasanya, itu akan membuat satu file besar 2MB +, tetapi jika Anda menghapus hal-hal yang tidak Anda gunakan, itu bisa sangat kecil. Melakukannya dengan cara ini, berarti Anda hanya perlu menarik brython.js, py_VFS.js dan kode python Anda, dan tidak ada permintaan XHR tambahan yang diperlukan.
Transcrypt ( Github ) di sisi lain, didistribusikan sebagai paket python 3yang dapat Anda gunakan secara manual, atau terhubung ke toolchain Anda, untuk mengkompilasi python ke javascript terlebih dahulu. Jadi dengan Transcrypt, Anda menulis dengan python, menjalankan transcrypt terhadap python dan itu mengeluarkan javascript yang dapat Anda tautkan dalam proyek Anda. Ini lebih seperti kompiler tradisional karena menawarkan beberapa kontrol atas output. Misalnya, Anda dapat memilih untuk mengompilasi ke ES6 atau ES5, atau memintanya untuk mengeluarkan peta sumber (bahwa selama debugging biarkan browser membawa Anda langsung ke kode python yang sesuai, selain kode javascript yang dihasilkan.) Output javascript Transcrypt cukup singkat ( atau dengan kata lain, itu cantik dan singkat). Dalam kasus saya, 150kB python diubah menjadi 165kB javascript ES5 tanpa ukuran. Sebagai perbandingan, versi Brython dari proyek saya menggunakan sekitar 800Kb setelah konversi.
Namun, untuk mendapatkan manfaat dari ketegasan Transcrypts, membutuhkan membaca dokumen sedikit (benar-benar hanya sedikit). Misalnya, dengan Transcrypt, 'kebenaran' Python untuk struktur data seperti dict, set, dan list tidak diaktifkan secara default dan mengaktifkannya secara global tidak disarankan karena potensi masalah kinerja terkait dengan pemeriksaan ketik. Untuk kejelasan: Di bawah CPython, sebuah dict, set atau list kosong memiliki nilai kebenaran False, sedangkan di Javascript dianggap 'true' .. Contoh:
myList = [] if myList: # False in CPython bcs it's empty, true in javascript bcs it exists # do some things.
Setidaknya ada tiga cara untuk mengatasinya:
__pragma__(tconv)
atau di__pragma__(notconv)
dalam kode Anda untuk memberi tahu kompilator transcrypt untuk mengaktifkan konversi otomatis ke nilai kebenaran seperti python secara lokal.Benar, jadi proyek saya semakin besar dan saya ingin melakukan pra-kompilasi untuk mendapatkan kinerja tetapi merasa sulit melakukannya dengan Brython (meskipun secara teknis memungkinkan, cara mudah untuk menggunakan editor online dan klik tombol javascript untuk melihat hasil). Saya melakukan itu dan menautkan ke javascript yang dihasilkan dari project.html tetapi tidak berhasil karena beberapa alasan. Juga, saya merasa sulit untuk memahami pesan kesalahan dari Brython sehingga saya tidak tahu harus mulai dari mana setelah langkah ini gagal. Juga, ukuran besar kode yang dikeluarkan dan ukuran mesin brython mulai mengganggu saya. Jadi saya memutuskan untuk melihat lebih dekat Transcrypt, yang pada awalnya tampak memiliki nilai yang lebih tinggi karena saya lebih suka instruksi bodoh yang memberi tahu saya cara memulai segera (ini telah ditambahkan).
Hal utama untuk menyiapkannya setelah menginstal Python3.5 adalah:
activate
terminal saat ini jika Anda tidak ingin harus mengetikkan path lengkap ke nama folder / bin / python3.5 setiap saat. Aktifkan dengan mengetik: 'nama folder sumber / bin / aktifkan'__javascript__
. Anda kemudian dapat menautkan ke javascript yang dikeluarkan dari html Anda.Masalah utama berpindah
Saya memiliki kebutuhan yang agak sederhana, jadi jarak tempuh Anda mungkin berbeda.
Anda perlu mengganti lib standar brython atau python dengan libs javascript. Jadi misalnya 'import json' disediakan oleh Brython, tetapi di bawah Transcrypt Anda dapat menggunakan javascript lib atau hanya menggunakan JSON.parse / JSON.stringify langsung di kode Python Anda. Untuk menyertakan versi perpustakaan javascript yang dikecilkan secara langsung di kode python Anda, gunakan format ini (perhatikan tanda kutip tiga):
__pragma__ ('js', '{}', ''' // javascript code ''')
Fungsi spesifik html Brython jelas tidak berfungsi dengan Transcrypt. Cukup gunakan cara javascript biasa. Contoh: 1) di bawah Brython, Anda mungkin merujuk ke tag HTML tertentu menggunakan 'document [' id ']', tetapi dengan Transcrypt Anda akan menggunakan 'document.getElementById (' id ') (yang sama seperti yang Anda lakukan itu dari javascript). 2) Anda tidak dapat menghapus node dengan 'del nodeName' (bcs itu adalah fungsi brython). Gunakan sesuatu seperti 'node.parentNode.removeChild (node)'. 3) ganti semua fungsi DOM brython dengan alternatif javascript. misalnya class_name = className; text = textContent; html = innerHTML; parent = parentNode; children = childNodes dll. Saya kira jika Anda membutuhkan sesuatu yang berisi alternatif yang dibutuhkan oleh beberapa browser lama maka ada perpustakaan javascript untuk itu. 4) Set_timeout Brython diganti dengan javascripts setTimeout 5) Tag html Brython seperti BR () perlu diganti menggunakan cara javascript normal serta mengulang tempat yang Anda gunakan <= dom manipulation syntax. Masukkan markup teks biasa sebagai innerHTML atau buat elemen menggunakan sintaks javascript, lalu lampirkan menggunakan sintaks DOM javascript normal. Saya juga memperhatikan bahwa untuk kotak centang, brython menggunakan "if checkbox = 'memeriksa':" tetapi Transcrypt senang dengan "jika kotak centang:" .. Masukkan markup teks biasa sebagai innerHTML atau buat elemen menggunakan sintaks javascript, lalu lampirkan menggunakan sintaks DOM javascript normal. Saya juga memperhatikan bahwa untuk kotak centang, brython menggunakan "if checkbox = 'memeriksa':" tetapi Transcrypt senang dengan "jika kotak centang:" .. Masukkan markup teks biasa sebagai innerHTML atau buat elemen menggunakan sintaks javascript, lalu lampirkan menggunakan sintaks DOM javascript normal. Saya juga memperhatikan bahwa untuk kotak centang, brython menggunakan "if checkbox = 'memeriksa':" tetapi Transcrypt senang dengan "jika kotak centang:" ..
Saya selesai memindahkan proyek 2700 baris selama minggu lalu di mana Transcrypt tidak memiliki dukungan untuk beberapa hal kecil (meskipun cukup mudah untuk diganti dengan pengisi), ini adalah 1) str.lower, str.split (str. split ada, tetapi tampaknya merupakan pemisahan javascript, yang bekerja secara berbeda dengan versi python, perilaku yang saya andalkan), 2) putaran (ini tampaknya didukung dalam versi dev sekarang) dan 3) isinstance tidak tidak bekerja pada str, int dan float, hanya pada dict, list dan set. 4) Perbedaan lain dari Brython yang saya perhatikan adalah bahwa jika saya menarik representasi JSON dari sebuah dict, saya perlu melakukannya menggunakan 'myDict = dict (data)', sedangkan brython senang dengan 'myDict = data'. Tapi itu mungkin terkait dengan sesuatu di json.loads Brython, yang saya ganti langsung dengan JSON.parse.
__pragma__('opov')
untuk lokal), Anda tidak dapat melakukan hal-hal seperti operasi set menggunakan format kelebihan beban, tetapi perlu menggunakan fungsi yang sesuai. Misalnyaa = 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) Selain itu, Anda tidak dapat mengulang dicts secara default menggunakan 'for i in dict:', tanpa mengaktifkannya (cmd line -i atau
__pragma__('iconv')
, tetapi Anda dapat menghindari keharusan untuk mengaktifkannya hanya dengan menggunakan keys () anggota misalnya:for key, value in dict.items(): # do things for each key and value..
Untuk meringkas
Saya suka Brython karena mudah untuk menggunakannya dan untuk menguji kode Anda (hanya F5). Ini lebih dekat dengan python sejati karena sebagian besar lib standar ada di sana. Saya tidak suka harus menyertakan mesin transpilasi (Sunting: Atau orang mungkin melihatnya sebagai VM python) di browser dan ukuran javascript keluaran besar. Jika saya harus melakukan banyak hal (tetapi masih menggunakan Brython), saya akan menggunakan metode javascript untuk memanipulasi DOM dari brython (yang dapat Anda lakukan ..), alih-alih banyak bersandar pada metode brython karena itu membuang waktu untuk berpindah ke transpiler lain saat kebutuhan saya berubah.
Saya suka Transcrypt karena javascript yang dikeluarkan benar-benar 'ramping dan berarti' dan karena satu-satunya hal yang Anda muat di sisi browser adalah kode javascript yang Anda buat yang ukurannya serupa dengan kode python Anda. Juga karena ia mendukung peta sumber dan karena memberi saya ukuran kendali atas javascript yang dikeluarkan. Dan menggunakannya mengajari saya sedikit tentang pengoptimalan.
Harapan yang membantu seseorang melihat mana di antara ini yang mungkin baik untuk proyek khusus mereka.
sumber
https://brythonista.wordpress.com/2015/03/28/comparing-the-speed-of-cpython-brython-skulpt-and-pypy-js/
Halaman ini menjadi tolok ukur ketiga kandidat. Brython muncul sebagai pemenang yang jelas.
Terlepas dari 'bantuan' yang menjelaskan bahwa SO tidak baik untuk pertanyaan semacam ini, tampaknya jawaban yang ringkas dalam kasus ini adalah mungkin.
Mungkin orang-orang terlalu terburu-buru?
sumber
Saya telah menggunakan dan berkomitmen untuk memahat serta pypyjs. Dan ketiganya sangat berbeda sehingga setiap perbandingan bisa diperdebatkan jika Anda bertanya kepada saya.
Itu tergantung pada apa yang Anda cari yang paling masuk akal.
PyPyJS
pypyjs sangat besar, ini adalah file javascript 12MB yang berisi seluruh mesin virtual pypy. Jadi jika Anda ingin kelengkapan implementasi python ini adalah buah hati Anda. Ini memiliki jembatan javascript yang berfungsi sangat baik tetapi itu bukan pilihan yang layak untuk menulis kode situs web javascript Anda dengan python. Namun itu akan membiarkan Anda
import compiler
.Itu dibangun dengan emscripten dan lebih cepat dari CPython, dalam menjalankan benchmark pystone.
Saya memberikan ceramah singkat tentang pypyjs di sini adalah slide.
Skulpt
Merupakan alat pengajaran (atau telah berkembang seiring waktu), alat ini mengkompilasi python Anda menjadi mesin negara yang sangat mirip dengan meniru compiler cpython. Pada intinya, ini adalah implementasi compiler python dalam javascript dengan tulisan tangan. Ini memungkinkan eksekusi asinkron yang memungkinkan Anda melakukan:
while (True): print "hi"
Tanpa mengunci browser.
Skulpt adalah satu-satunya yang mendukung kelanjutan asinkron, ini memungkinkan Anda menjeda eksekusi python sementara itu menyelesaikan beberapa hal asinkron yang akan terjadi. Membuat ini berhasil:
from time import sleep sleep(1)
Skulpt berjalan sekitar sepersepuluh dari kecepatan CPython, saat membandingkan pystone.
Brython
Sedikit yang saya tahu tentang yang ini mungkin @ olemis-lang bisa mengembangkan yang ini. Tetapi di samping perbedaan yang jelas bahwa Brython adalah py3 dan yang lainnya py2. Brython juga merupakan transpiler.
Brython tidak menjalankan benchmark pystone karena time.clock tidak diimplementasikan, karena secara resmi ini adalah fungsi perangkat keras.
sumber
Pertama-tama, saya adalah pelaku Brython. Namun demikian, saya akan mencoba untuk bersikap tidak memihak mungkin demi melakukan penilaian yang obyektif.
Terakhir kali saya menggunakannya, Skulpt tidak mendukung fitur seperti ekspresi generator. Brython dan PyPy.js melakukannya, jadi di tingkat fitur IMHO lebih unggul.
Brython (saat ini) masih dalam proses. Beberapa modul tidak dapat diimpor (misalnya xml.ElementTree ). Namun demikian situasi ini mulai berubah karena kami sedang bekerja untuk menjalankan seluruh rangkaian pengujian CPython meskipun telah mencapai kompatibilitas penuh dengan standar (setidaknya jika masuk akal).
Brython juga mendukung .vfs.js untuk mempercepat impor modul.
PyPy.js memiliki sejumlah karakteristik yang mengikuti langsung dari kenyataan bahwa itu didukung oleh PyPy (kompilasi JIT, teruji dengan baik, ...) tetapi saya tidak yakin apakah itu cocok untuk dijalankan di browser. Ini mungkin berubah seiring dengan perkembangan proyek.
TODO: Saya akan mencoba melengkapi jawaban saya dengan tolok ukur yang dapat diandalkan.
sumber
Tidak disebutkan di sini adalah RapydScript atau RapydScript-NG. Mereka menghasilkan kode JavaScript yang sangat efisien, yang digunakan di GlowScript VPython (glowscript.org). Saya dulu menggunakan RapydScript asli Alex Tsepkov ( https://github.com/atsepkov/RapydScript ) tetapi baru-baru ini beralih ke RapydScript-NG dari Kovid Goyal ( https://github.com/kovidgoyal/rapydscript-ng ). Saya baru-baru ini menjalankan benchmark pystone di CPython, RapydScript, dan Brython, dan Anda dapat melihat hasilnya di sini:
https://groups.google.com/forum/?fromgroups&hl=id#!topic/brython/20hAC9L3ayE
sumber
Karena tidak ada yang menyebutkannya, saya pikir pantas untuk menyebutkan Batavia yang mengimplementasikan mesin virtual Python untuk menjalankan bytecode Python yang telah dikompilasi.
Saya baru mencobanya dan, meskipun ini konsep yang menarik, ini masih dalam tahap awal karena hanya ada sedikit dokumentasi.
Pada akhirnya itu akan tergantung pada apa yang Anda coba lakukan. Saya memilih Transcrypt setelah melihat-lihat karena lebih pragmatis dan performanya lebih baik, juga lebih baru dirilis / dipertahankan.
sumber
Ini adalah konferensi yang diperbarui yang membandingkan semua opsi yang tersedia di pasar saat ini:
https://www.youtube.com/watch?v=2XSeNQyPlTY
Pembicaranya adalah Russell Keith-Magee, yang merupakan pengembang terkenal di daerah tersebut.
sumber