Я очень рад видеть, что теперь можно писать код Python в браузере. Это основные кандидаты (пожалуйста, добавьте всех, которые я, возможно, не заметил):
Но как выбрать между ними? Единственное очевидное отличие, которое я вижу, заключается в том, что Skulpt основан на Python 2, тогда как Brython основан на Python 3.
Обратите внимание: это не запрос рекомендаций или мнений. Я ищу объективные факты, которые послужили бы основой для осознанного выбора.
Ответы:
Запуск Python в браузере - действительно хорошая и актуальная (по состоянию на 2019 год) статья, в которой сравниваются Brython, Skulpt, PyPy.js, Transcrypt, Pyodide, Batavia . Я очень рекомендую это прочитать.
Хорошее резюме можно увидеть на следующих картинках.
источник
Вот некоторая информация о Brython vs Transcrypt (июль 2016 года, поскольку Transcrypt была добавлена в качестве опции по этому вопросу OP), полученная при запуске проекта с Brython несколько месяцев назад и переходе на Transcrypt (завершенный переход на прошлой неделе). Мне нравятся Brython и Transcrypt, и я вижу их применение.
Для людей, которые не знакомы с этим, Brython и Transcrypt оба «переносят» ввод Python в javascript (Edit: возможно, лучше рассматривать Brython как «реализацию Python для браузера», потому что он не создает автономный javascript). Оба требуют синтаксиса Python 3. Brython включает в себя значительное количество стандартных библиотек Python и некоторые из них для работы с вещами, связанными с Интернетом, тогда как Transcrypt избегает этого по большей части и предлагает вместо этого использовать библиотеки Javascript.
Brython ( Github) можно выполнить преобразование в браузере. Итак, вы пишете на python, а движок brython.js конвертирует его в javascript на лету, когда страница загружается. Это действительно удобно и намного быстрее, чем вы думаете. Однако движок brython.js, который вам нужно включить на свои страницы, составляет около 500 КБ. Кроме того, существует вопрос импорта стандартных библиотек, который Brython обрабатывает, получая отдельные файлы .js с запросами XHR. Некоторые библиотеки уже скомпилированы в brython.js, поэтому не каждый импорт будет включать новые файлы, но если вы используете много операций импорта, все может замедлиться. Однако есть способы обойти это. Что я сделал, так это проверил вкладку сети в инструментах разработчика браузера, чтобы увидеть, какие файлы были загружены при загрузке страницы, а затем удалил все файлы, которые мой проект не использовал в копии папки Brython src, и запустите сценарий, включенный в Brython (я думаю, что он находится в Brython / www / scripts / make_VFS.py), который компилирует все доступные библиотеки в один файл с именем py_VFS.js, на который вам также нужно ссылаться из вашего html. Обычно получается один огромный файл размером 2 МБ +, но если вы удалите то, что не используете, он может стать совсем маленьким. Это означает, что вам нужно использовать только brython.js, py_VFS.js и ваш код Python, и никаких дополнительных запросов XHR не потребуется.
Transcrypt ( Github ), с другой стороны, распространяется как пакет python 3.которые вы можете использовать вручную или подключиться к своей инструментальной цепочке, чтобы заранее скомпилировать python в javascript. Итак, с Transcrypt вы пишете на python, запускаете transcrypt против python, и он выплевывает javascript, на который вы можете ссылаться в своем проекте. Он больше похож на традиционный компилятор тем, что предлагает некоторый контроль над выводом. Например, вы можете выбрать компиляцию в ES6 или ES5 или попросить его вывести исходные карты (чтобы во время отладки браузер перенаправлял вас прямо к соответствующему коду Python, вместо сгенерированного кода javascript). Вывод Transcrypt на javascript довольно краток ( или, другими словами, красиво и лаконично). В моем случае 150 КБ Python преобразуются в 165 КБ неминифицированного JavaScript ES5. Для сравнения, версия моего проекта на Brython использовала после преобразования около 800 КБ.
Однако для того, чтобы воспользоваться преимуществами краткости Transcrypts, необходимо немного прочитать документацию (на самом деле совсем немного). Например, с Transcrypt «правдивость» Python для таких структур данных, как dict, set и list, не включена по умолчанию, а ее глобальное включение не рекомендуется из-за потенциальных проблем с производительностью, связанных с проверкой типов. Для ясности: в CPython пустой dict, set или list имеет истинное значение False, тогда как в Javascript он считается «истинным» .. Пример:
myList = [] if myList: # False in CPython bcs it's empty, true in javascript bcs it exists # do some things.
Есть как минимум три способа решить эту проблему:
__pragma__(tconv)
или__pragma__(notconv)
в своем коде, чтобы указать компилятору транскрипции включить автоматическое преобразование в значения истинности, подобные Python, локально.Итак, мой проект становился все больше, и я хотел предварительно скомпилировать для повышения производительности, но обнаружил, что это сложно сделать с Brython (хотя это технически возможно, простой способ - использовать онлайн-редактор. и нажать кнопку javascript, чтобы увидеть выход). Я сделал это и связался с сгенерированным javascript из project.html, но по какой-то причине он не работал. Кроме того, мне трудно понимать сообщения об ошибках от Brython, поэтому я не знал, с чего начать после того, как этот шаг не удался. Кроме того, меня начали беспокоить большой размер выводимого кода и размер движка brython. Поэтому я решил поближе взглянуть на Transcrypt, который на первый взгляд казался более высоким, потому что я предпочитаю упрощенные инструкции, которые говорят мне, как немедленно начать работу (с тех пор они были добавлены).
Главное, что нужно было настроить после установки Python3.5:
activate
текущий терминал, если вы не хотите каждый раз вводить полный путь к имени папки / bin / python3.5. Активируйте, набрав: 'исходная папка / bin / активировать'__javascript__
. Затем вы можете сделать ссылку на выведенный javascript из своего html.Основные проблемы переходят
У меня довольно простые потребности, поэтому ваш опыт может отличаться.
Вам необходимо заменить стандартные библиотеки brython или python на библиотеки javascript. Так, например, «import json» предоставляется Brython, но в Transcrypt вы можете использовать библиотеку javascript или просто использовать JSON.parse / JSON.stringify непосредственно в вашем коде Python. Чтобы включить уменьшенную версию библиотеки javascript непосредственно в код Python, используйте этот формат (обратите внимание на тройные кавычки):
__pragma__ ('js', '{}', ''' // javascript code ''')
Очевидно, что специфические функции Brython для html не работают с Transcrypt. Просто используйте обычные способы javascript. Примеры: 1) в Brython вы могли бы сослаться на конкретный HTML-тег, используя 'document [' id ']', но с Transcrypt вы бы использовали 'document.getElementById (' id ') (как и вы это из javascript). 2) Вы не можете удалить узел с помощью 'del nodeName' (bcs, это функция brython). Используйте что-то вроде node.parentNode.removeChild (node). 3) заменить все функции DOM brython на альтернативы javascript. например class_name = className; text = textContent; html = innerHTML; parent = parentNode; children = childNodes и т. д. Я думаю, если вам нужно что-то, что содержит альтернативы, требуемые некоторыми старыми браузерами, для этого есть библиотеки javascript. 4) set_timeout Brython заменен на javascripts setTimeout 5) HTML-теги Brython, такие как BR (), необходимо заменить обычными способами javascript, а также повторить все места, где вы использовали синтаксис манипуляции с <= dom. Либо введите разметку обычного текста как innerHTML, либо создайте элементы, используя синтаксис javascript, а затем прикрепите их, используя обычный синтаксис DOM javascript. Я также заметил, что для флажков brython использует «if checkbox = 'checked':», но Transcrypt доволен «if checkbox:» .. Либо введите разметку обычного текста как innerHTML, либо создайте элементы, используя синтаксис javascript, а затем прикрепите их, используя обычный синтаксис DOM javascript. Я также заметил, что для флажков brython использует «if checkbox = 'checked':», но Transcrypt доволен «if checkbox:» .. Либо введите разметку обычного текста как innerHTML, либо создайте элементы, используя синтаксис javascript, а затем прикрепите их, используя обычный синтаксис DOM javascript. Я также заметил, что для флажков brython использует «if checkbox = 'checked':», но Transcrypt доволен «if checkbox:» ..
Я закончил перенос проекта на 2700 строк на прошлой неделе, когда у Transcrypt не было поддержки нескольких второстепенных вещей (хотя их было достаточно легко заменить с помощью наполнителей), это были 1) str.lower, str.split (str. split присутствует, но, похоже, это разделение javascript, которое работает иначе, чем версия python, на поведение которой я полагался), 2) round (похоже, теперь это поддерживается в версии dev) и 3) isinstance didn Не работают с str, int и float, только с dict, list и set. 4) Еще одно отличие от Brython, которое я заметил, заключается в том, что если я использую JSON-представление dict, мне нужно сделать это с помощью myDict = dict (data), тогда как brython был доволен «myDict = data». Но это может быть связано с чем-то в Brython json.loads, которое я заменил непосредственно на JSON.parse.
__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) Кроме того, вы не можете перебирать dicts по умолчанию, используя 'for i in dict:', без включения этого (cmd line -i или
__pragma__('iconv')
, но вы можете избежать необходимости включать его, просто используя член keys (), например:for key, value in dict.items(): # do things for each key and value..
Чтобы подвести итог
Мне нравится Brython, потому что с ним легко начать работу и протестировать ваш код (просто F5). Это ближе к истинному питону, потому что там большая часть стандартной библиотеки. Мне не нравится включать движок транспиляции (Edit: или можно рассматривать его как виртуальную машину python) в браузере и большой размер выводимого javascript. Если бы мне пришлось что-то делать (но все еще используя Brython), я бы использовал методы javascript для управления DOM из brython (что вы можете сделать ..) вместо того, чтобы так сильно полагаться на методы brython, потому что это трата времени на перемещение на другой транспайлер, когда мои потребности изменились.
Мне нравится Transcrypt, потому что выводимый javascript действительно «скудный и средний», и потому что единственное, что вы загружаете на стороне браузера, - это созданный вами код javascript, который по размеру похож на ваш код на Python. Также потому, что он поддерживает исходные карты и потому что он дает мне возможность контролировать выводимый javascript. И с его помощью я немного научился оптимизации.
Надеюсь, это поможет кому-то увидеть, какие из них могут быть полезны для их конкретного проекта.
источник
Я использовал и посвятил себя skulpt так же, как и pypyjs. И все они три очень разные, и, если вы спросите меня, любое сравнение будет спорным.
Это зависит от того, что вы ищете, что будет иметь наибольший смысл.
PyPyJS
pypyjs огромен, это файл javascript размером 12 МБ, который содержит всю виртуальную машину pypy. Так что если вы хотите полноты реализации Python, это ваш ребенок. У него есть мост javascript, который работает действительно хорошо, но это не жизнеспособный вариант для написания кода вашего веб-сайта javascript на python. Однако это позволит вам
import compiler
.Он построен с помощью emscripten и быстрее, чем CPython, при запуске теста pystone.
Я кратко рассказал о pypyjs, вот слайды.
Скульпт
Это обучающий инструмент (или со временем он превратился в него), он компилирует ваш питон в конечный автомат, очень близко имитирующий компилятор cpython. По сути, это рукописная реализация компилятора python на javascript. Он позволяет выполнять асинхронное выполнение, что позволяет:
while (True): print "hi"
Без блокировки браузера.
Skulpt - единственный, который поддерживает асинхронные продолжения, он позволяет приостанавливать выполнение python, пока он разрешает некоторые асинхронные вещи. Выполнение этой работы:
from time import sleep sleep(1)
По сравнению с pystone, Skulpt работает примерно в десять раз быстрее, чем CPython.
бритт
Я меньше всего знаю об этом, возможно, @ olemis-lang сможет расширить его. Но рядом с очевидной разницей, что Brython - это py3, а остальные - py2. Brython также является транспайлером.
Brython не запускает тест pystone, потому что time.clock не реализован, потому что официально это аппаратная функция.
источник
https://brythonista.wordpress.com/2015/03/28/comparing-the-speed-of-cpython-brython-skulpt-and-pypy-js/
На этой странице сравниваются три кандидата. Брайтон - явный победитель.
Несмотря на «помощь», объясняющую, что SO не подходит для такого рода вопросов, похоже, что в этом случае возможен краткий ответ.
Может, люди поторопятся?
источник
Прежде всего, я коммиттер Brython. Тем не менее, я постараюсь быть максимально беспристрастным, чтобы дать объективную оценку.
В последний раз, когда я использовал его, Skulpt не поддерживал такие функции, как выражения генератора. Brython и PyPy.js делают это, поэтому на уровне функций IMHO более поздние версии лучше.
Brython (в настоящее время) все еще продолжается. Некоторые модули не могут быть импортированы (например, xml.ElementTree ). Тем не менее, эта ситуация начинает меняться, поскольку мы работаем над запуском всего набора тестов CPython, несмотря на достижение полной совместимости со стандартами (по крайней мере, когда это имеет смысл).
Brython также поддерживает .vfs.js для ускорения импорта модулей.
PyPy.js имеет ряд характеристик, которые прямо вытекают из того факта, что он работает на PyPy (JIT-компиляция, хорошо протестирована, ...), но я не уверен, подходит ли он для работы в браузере. Это может измениться по мере развития проекта.
ТОДО: Я постараюсь дополнить свой ответ надежными тестами.
источник
Здесь не упоминаются RapydScript или RapydScript-NG. Они создают очень эффективный код JavaScript, который используется в GlowScript VPython (glowscript.org). Раньше я использовал оригинальный RapydScript Алекса Цепкова ( https://github.com/atsepkov/RapydScript ), но недавно перешел на RapydScript-NG Ковида Гояла ( https://github.com/kovidgoyal/rapydscript-ng ). Недавно я запустил тест pystone на CPython, RapydScript и Brython, и вы можете увидеть результаты здесь:
https://groups.google.com/forum/?fromgroups&hl=en#!topic/brython/20hAC9L3ayE
источник
Поскольку никто не упомянул об этом, я подумал, что стоит упомянуть Batavia, которая реализует виртуальную машину Python для запуска предварительно скомпилированного байт-кода Python.
Я только что попробовал, и, хотя это интересная концепция, она все еще находится на начальной стадии, так как документации мало.
В конце концов, это будет зависеть от того, что вы пытаетесь сделать. Я выбрал Transcrypt после того, как посмотрел, потому что он был более прагматичным и более производительным, а также недавно выпущенным / поддерживаемым.
источник
Это обновленная конференция, которая сравнивает все доступные варианты на рынке прямо сейчас:
https://www.youtube.com/watch?v=2XSeNQyPlTY
Спикер - Рассел Кейт-Маги, известный разработчик в этом районе.
источник