Выбор Java против Python в Google App Engine

161

В настоящее время Google App Engine поддерживает как Python, так и Java. Поддержка Java менее развита. Однако Java, похоже, имеет более длинный список библиотек и особенно поддерживает байт-код Java независимо от языков, используемых для написания этого кода. Какой язык даст лучшую производительность и большую мощность? Пожалуйста, порекомендуйте. Спасибо!

Изменить: http://groups.google.com/group/google-appengine-java/web/will-it-play-in-app-engine?pli=1

Редактировать: под «мощью» я подразумеваю лучшую расширяемость и включение доступных библиотек вне рамок. Python допускает только чистые библиотеки Python.

Viet
источник
теперь Google App Engine поддерживает Go (экспериментальный). Что ты думаешь об этом?
Бенджамин Крузье
@pinouchon Я начал использовать Go и внедрил его в производство на GAE. GO очень хорошо работает на GAE, компилируется за несколько секунд.
Мудро

Ответы:

123

Я предвзято (будучи экспертом по Python, но довольно хорошо разбираюсь в Java), но я думаю, что среда исполнения Python для GAE в настоящее время более продвинута и лучше разработана, чем среда исполнения Java - у первого был еще один год на разработку и развитие, в конце концов ,

Как будет развиваться ситуация в будущем, конечно, трудно предсказать - спрос, вероятно, сильнее на стороне Java (тем более, что речь идет не только о Java, но и о других языках, расположенных на вершине JVM, так что это способ запускать, например, PHP). или код Ruby в App Engine); однако команда разработчиков Python App Engine имеет преимущество в том, что на борту есть Гвидо ван Россум, изобретатель Python и удивительно сильный инженер.

С точки зрения гибкости, движок Java, как уже упоминалось, предоставляет возможность запуска байт-кода JVM, созданного на разных языках, а не только на Java - если вы находитесь в многоязычном магазине, это довольно большой плюс. И наоборот, если вы ненавидите Javascript, но должны выполнить некоторый код в браузере пользователя, GWT в Java (генерирующий Javascript для вас из вашего кода на уровне Java) будет гораздо богаче и более продвинутым, чем альтернативы на стороне Python (на практике, если вы выберете Python, вы сами напишете JS для этой цели, в то время как если вы выберете Java, GWT будет полезной альтернативой, если вы не любите писать JS).

С точки зрения библиотек это в значительной степени промывка - JVM достаточно ограничен (без потоков, без пользовательских загрузчиков классов, без JNI, без реляционных БД), чтобы затруднить простое повторное использование существующих библиотек Java на столько же или больше, чем на существующих Python. библиотекам также мешают подобные ограничения на время выполнения Python.

С точки зрения производительности, я думаю, что это мойка, хотя вы должны сравнивать свои собственные задачи - не полагайтесь на производительность высокооптимизированных реализаций JVM на основе JIT, не учитывающих их большое время запуска и объем памяти, потому что механизм приложения среда очень разная (затраты на запуск будут часто оплачиваться, так как экземпляры вашего приложения запускаются, останавливаются, перемещаются на разные хосты и т. д., как вы понимаете, такие события обычно намного дешевле в средах выполнения Python, чем в JVM).

Ситуация с XPath / XSLT (чтобы быть эвфемистической ...) не совсем идеальна с обеих сторон, вздох, хотя я думаю, что это может быть не так уж плохо в JVM (где, по-видимому, можно использовать существенные подмножества Saxon для запуска) с некоторой осторожностью). Я думаю, что стоит открывать Appengine Issues странице с XPath и XSLT в их заголовках - сейчас есть только вопросы, требующие определенных библиотек, и это близоруко: мне все равно, КАК реализован хороший XPath / XSLT, для Python и / или для Java, пока я использую его. (Определенные библиотеки могут облегчить миграцию существующего кода, но это менее важно, чем возможность выполнять такие задачи, как «быстрое применение преобразования XSLT» НЕКОТОРЫМ способом! -). Я знаю, что я бы отметил эту проблему, если бы хорошо сформулировал (особенно не зависящим от языка).

И последнее, но не менее важное: помните, что у вас может быть другая версия вашего приложения (с одним и тем же хранилищем данных), некоторые из которых реализованы с помощью среды выполнения Python, другие - с средой выполнения Java, и вы можете получить доступ к версиям, отличным от «default / active». "один с явными URL. Таким образом, вы можете использовать как код Python, так и код Java (в разных версиях вашего приложения) и изменять одно и то же хранилище данных, предоставляя вам еще большую гибкость (хотя только один будет иметь «красивый» URL, такой как foobar.appspot.com - я думаю, это важно только для доступа интерактивных пользователей в браузерах ;-).

Алекс Мартелли
источник
9
GWT - это, прежде всего, технология на стороне клиента - вы можете использовать ее независимо от того, является ли ваш сервер Python или Java. Вы теряете немного синтаксического сахара, выполняя rpc поверх JSON, а не встроенный в RPC GWT, но если вы ненавидите JS и делаете python, это все равно стоит посмотреть :)
Peter Recore
9
Существует Pyjamas ( pyjs.org ) в качестве Pythonic альтернативы GWT - она ​​возьмет код Python и скомпилирует его в Javascript, как GWT для кода Java.
Дейв Кирби
7
Просто, чтобы дать перспективу «5 лет спустя». Как Java-разработчик, я чувствую, что GAE использует устаревший стек. Вы не найдете поддержки Java 8 ( они работают как с Java 6, так и с устаревшим контейнером Jetty 6 с Servlet API 2.5 ), но в целом поддержка Java в GAE все еще застряла в 2010 году. Хотя я люблю простоту GAE и Google Powerful Services, Я не могу рекомендовать GAE для Java, пока они не обновят свой стек.
Энтони Аккиоли,
72

Следите за изменениями в производительности Python и Java:

http://gaejava.appspot.com/ (редактировать: извинения, ссылка теперь не работает. Но следующий пункт все еще применялся, когда я видел, как он работал в последний раз)

В настоящее время Python и использование низкоуровневого API в Java быстрее, чем JDO на Java, для этого простого теста . По крайней мере, если основной движок изменится, это приложение должно отражать изменения производительности.

Ричард Уотсон
источник
5
При всем уважении, я считаю этот тест достаточно простым, чтобы быть бессмысленным. Для чего это стоит ... Если вы используете Java / GAE, я рекомендую использовать API низкого уровня и избегать JDO или любой другой инфраструктуры. Что еще более важно, JDO дает вам ощущение, что вы работаете с реляционной базой данных, что может вводить в заблуждение.
Mo'in Creemers
1
Я согласен избегать JDO, отчасти по той причине, о которой вы упомянули, а также потому, что она медленнее, чем низкоуровневая. (Что обычно показывает тест.) Он просто намекает на наличие различий в производительности, поэтому либо не используйте JDO, либо тестируйте для своей конкретной задачи. Я переместил весь свой собственный код из JDO и низкоуровневый API в Objectify. И в любом случае, это также показывает, что Python определенно не плохой родственник производительности в GAE.
Ричард Уотсон
1
Ваше приложение выдает внутреннюю ошибку сервера.
Томдемайт
1
Спасибо, Том. Не мое приложение, к сожалению. Отправили по почте кого-то, кто может быть связан.
Ричард Уотсон
1
Я хотел бы увидеть, как объективизируется в этом тесте
Моше Шахам
18

Основываясь на опыте запуска этих виртуальных машин на других платформах, я бы сказал, что вы, вероятно, получите более высокую производительность благодаря Java, чем Python. Однако не стоит недооценивать преимущества Python: язык Python гораздо более продуктивен с точки зрения строк кода - общее согласие состоит в том, что Python требует трети кода эквивалентной программы Java, оставаясь при этом как более читаемым или более читаемым. Это преимущество умножается на возможность немедленного запуска кода без явного шага компиляции.

Что касается доступных библиотек, вы обнаружите, что большая часть обширной библиотеки времени выполнения Python работает «из коробки» (как и Java). Популярная веб-инфраструктура Django ( http://www.djangoproject.com/ ) также поддерживается в AppEngine.

Что касается «власти», трудно понять, что вы имеете в виду, но Python используется во многих различных областях, особенно в Интернете: YouTube написан на Python, как и Sourceforge (по состоянию на прошлой неделе).

Judy2K
источник
Спасибо Judy2K! Под властью я имею в виду сделать больше вещей и легко расширять.
Viet
15

Июнь 2013: это видео очень хороший ответ от инженера Google:

http://www.youtube.com/watch?v=tLriM2krw2E

TLDR; является:

  • Выберите язык, с которым вы и ваша команда наиболее продуктивны
  • Если вы хотите создать что-то для производства: Java или Python (не Go)
  • Если у вас большая команда и сложная база кода: Java (из-за статического анализа кода и рефакторинга)
  • Небольшие команды, которые быстро повторяются: Python (хотя с Java тоже все в порядке)
Bijan
источник
9

При выборе между Python и Java важно учитывать, как вы будете использовать хранилище данных на каждом языке. (и большинство других аспектов исходного вопроса уже были достаточно хорошо рассмотрены в этой теме).

Для Java стандартным методом является использование JDO или JPA. Они отлично подходят для переносимости, но не очень хорошо подходят для хранилища данных.

Доступен низкоуровневый API, но это слишком низкий уровень для повседневного использования - он больше подходит для создания сторонних библиотек.

Для Python существует API, разработанный специально для предоставления приложениям простого, но мощного доступа к хранилищу данных. Это здорово, за исключением того, что он не переносимый, поэтому он блокирует вас в GAE.

К счастью, разрабатываются решения для слабых мест, перечисленных для обоих языков.

Для Java низкоуровневый API используется для разработки постоянных библиотек, которые намного лучше подходят для хранилища данных, чем JDO / JPA (IMO). Примеры включают проект Сиена и Objectify .

Недавно я начал использовать Objectify и считаю, что он очень прост в использовании и хорошо подходит для хранилища данных, и его растущая популярность вылилась в хорошую поддержку. Например, Objectify официально поддерживается новой службой Google Cloud Endpoints. С другой стороны, Objectify работает только с хранилищем данных, тогда как Siena «вдохновлена» хранилищем данных, но предназначена для работы с различными базами данных SQL и хранилищами данных NoSQL.

Для Python предпринимаются попытки разрешить использование API хранилища данных Python GAE вне GAE. Одним из примеров является серверная часть SQLite, которую Google выпустил для использования с SDK, но я сомневаюсь, что они намерены превратиться в нечто готовое к производству. TyphoonAE вероятно, имеет больший потенциал, но я не думаю, что он также готов к производству (поправьте меня, если я ошибаюсь).

Если кто-то имеет опыт работы с любой из этих альтернатив или знает о других, пожалуйста, добавьте их в комментарии. Лично мне действительно нравится хранилище данных GAE - я считаю, что это значительное улучшение по сравнению с AWS SimpleDB - поэтому я желаю успеха в этих усилиях по облегчению некоторых проблем при его использовании.

Том
источник
7

Я настоятельно рекомендую Java для GAE, и вот почему:

  1. Производительность: Java потенциально быстрее, чем Python.
  2. Разработка Python находится под давлением нехватки сторонних библиотек. Например, XSLT для Python / GAE вообще отсутствует. Почти все библиотеки Python являются C-привязками (и они не поддерживаются GAE).
  3. Memcache API: Java SDK обладает более интересными возможностями, чем Python SDK.
  4. API хранилища данных: JDO очень медленный, но собственный API хранилища данных Java очень быстрый и простой.

Я использую Java / GAE в разработке прямо сейчас.

Павел
источник
1
@Paul - не могли бы вы порекомендовать (или дать ссылки на) лучший способ справиться с постоянством, используя Java на GAE, если JDO не подходит?
Mark
1
@ Марк, извините за задержку. Я думаю, что code.google.com/p/objectify-appengine - лучший выбор на данный момент.
Пол
7
-1 за откровенную ложь в пунктах № 2 и № 3 и № 4 не имеет никакого смысла.
Триптих
@Triptych, дайте мне знать, как называется процессор XSLT для python / GAE? И что эквивалентно операции CAS (putIfUntouched) для memcache / python / GAE?
Paul
1
@ Пол, если вы хотите, чтобы я рассмотрел эти вещи как часть вашего ответа, вы должны были включить их в свой ответ. Вместо этого вы включаете строку полуправды. Никто не выбирает язык, основанный на угловых случаях, которые вы предлагаете сейчас.
Триптих
6

Как вы определили, использование JVM не ограничивает вас использованием языка Java. Список языков JVM и ссылки можно найти здесь . Однако Google App Engine ограничивает набор классов, которые вы можете использовать из обычного набора Java SE, и вы захотите выяснить, может ли какая-либо из этих реализаций использоваться в механизме приложения.

РЕДАКТИРОВАТЬ: я вижу, вы нашли такой список

Я не могу комментировать производительность Python. Однако JVM является очень мощной платформой с точки зрения производительности, учитывая ее способность динамически компилировать и оптимизировать код во время выполнения.

В конечном счете, производительность будет зависеть от того, что делает ваше приложение и как вы его кодируете. Из-за отсутствия дополнительной информации, я думаю, что невозможно дать больше указателей в этой области.

Брайан Агнью
источник
Спасибо за быстрый ответ, Брайан. Я намерен сфокусировать приложение на извлечении URL-адресов, разборе XML и обработке XSLT. Будет меньше обслуживания HTTP-контента для браузеров.
Вьетнам
6

Я был поражен тем, насколько чист, понятен и без проблем Python / Django SDK. Однако я начал сталкиваться с ситуациями, когда мне нужно было начать делать больше JavaScript, и подумал, что, возможно, захочу воспользоваться преимуществами GWT и других утилит Java. Я только что прошел половину учебного курса по Java для GAE и сталкивался с одной проблемой за другой: проблемы с настройкой Eclipse, версионит JRE, невероятная сложность Java и запутанный и, возможно, неработающий учебник. Проверка этого сайта и других, связанных здесь отсюда, подтвердила его для меня. Я возвращаюсь к Python, и я посмотрю на пижаму, чтобы помочь с моими проблемами JavaScript.

mjhm
источник
5

Я немного опоздал на разговор, но вот мои два цента. Мне действительно было трудно выбирать между Python и Java, так как я хорошо разбираюсь в обоих языках. Как мы все знаем, у обоих есть свои преимущества и недостатки, и вы должны учитывать ваши требования и структуры, которые лучше всего подходят для вашего проекта.

Как я обычно делаю в этом типе дилемм, я ищу цифры, чтобы поддержать мое решение. Я решил пойти с Python по многим причинам, но в моем случае был один сюжет, который был переломным моментом. Если вы выполняете поиск «Google App Engine» в GitHub по состоянию на сентябрь 2014 года , вы увидите следующую цифру:

GAE Language Stats

В этих числах может быть много смещений, но в целом в три раза больше репозиториев GAE Python, чем в репозиториях GAE Java. Не только это, но если вы перечислите проекты по «количеству звезд», вы увидите, что большинство проектов Python появляются сверху (вы должны принять во внимание, что Python был дольше). Для меня это является веским аргументом в пользу Python, потому что я принимаю во внимание принятие и поддержку сообществом, документацию и доступность проектов с открытым исходным кодом.

Хайме Иван Сервантес
источник
3

Это хороший вопрос, и я думаю, что многие ответы дали хорошие точки зрения на плюсы и минусы по обе стороны забора. Я пробовал и AppEngine на основе Python, и на основе JVM (в моем случае я использовал Gaelyk, который является Groovy-фреймворком для приложений, созданным для AppEngine). Когда дело доходит до производительности на платформе, я не учел одну вещь, пока она не смотрела мне в глаза, это последствия «загрузки запросов», которые происходят на Java стороне забора. При использовании Groovy эти запросы загрузки являются убийцей.

Я собрал сообщение по этой теме ( http://distractable.net/coding/google-appengine-java-vs-python-performance-comparison/ ), и я надеюсь найти способ обойти эту проблему, но если нет, думаю, я вернусь к комбинации Python + Django, пока холодный запуск Java-запросов не окажет меньшего влияния.

Дэймон Уэльман
источник
3

Исходя из того, насколько я слышу, что Java-люди жалуются на AppEngine по сравнению с пользователями Python, я бы сказал, что Python гораздо менее напряженный в использовании.

Ной Макилрейт
источник
7
Я слышал, что владельцы Ford жалуются на свои машины гораздо больше, чем владельцы Koenigsegg. Почему это может быть?
Axarydax
2

Есть также проект Unladen Swallow , который, по-видимому, финансируется Google, если не принадлежит Google. Они пытаются реализовать бэк-код на основе LLVM для байт-кода Python 2.6.1, чтобы они могли использовать JIT и различные приятные оптимизации для собственного кода / GC / многоядерных процессоров. (Хорошая цитата: «Мы стремимся не делать оригинальной работы, а использовать как можно больше из последних 30 лет исследований».) Они ищут 5-кратное ускорение CPython.

Конечно, это не отвечает на ваш непосредственный вопрос, но указывает на «сокращение разрыва» (если есть) в будущем (надеюсь).

синхронизаторы
источник
1
Unladen Swallow теперь мертвый проект, и последнему коммиту больше года .
Чепанг
2

Прелесть питона в наши дни в том, насколько хорошо он общается с другими языками. Например, вы можете использовать Python и Java на одной и той же таблице с Jython. Конечно, jython, хотя он полностью поддерживает библиотеки Java, он не поддерживает полностью библиотеки Python. Но это идеальное решение, если вы хотите возиться с библиотеками Java. Он даже позволяет смешивать его с кодом Java без дополнительного кодирования.

Но даже сам Python сделал несколько шагов вперед. См., Например, ctypes, около C speed, прямой доступ к библиотекам C - все это, не выходя из комфорта программирования на python. Cython делает еще один шаг вперед, позволяя с легкостью смешивать код c с кодом Python, или даже если вы не хотите связываться с c или c ++, вы все равно можете кодировать на python, но использовать переменные статического типа, что делает ваши программы на python такими же быстрыми, как приложения на C , Кстати, Cython используется и поддерживается Google.

Вчера я даже нашел инструменты для Python для встроенного C или даже Assembly (см. CorePy), вы не можете получить более мощный, чем это.

Python, безусловно, является очень зрелым языком, не только стоящим на себе, но и способным легко взаимодействовать с любым другим языком. Я думаю, именно это делает Python идеальным решением даже в очень сложных и сложных сценариях.

С помощью Python вы можете получить доступ к C / C ++, Java, .NET и многим другим библиотекам с почти нулевым дополнительным кодированием, предоставляя вам также язык, который минимизирует, упрощает и украшает кодирование. Это очень заманчивый язык.

kilon
источник
Вопрос о java против python в GAE, который имеет много ограничений. Следовательно, ваши аргументы неприменимы.
Данияр
Я согласен с @Daniyar, что этот ответ немного (или, возможно, полностью) не в ритме, но мне нравится ответ, и это было то, что я искал. Спасибо, Килон, за то, что поделился этими знаниями. Может быть, это было не то место, но вы наверняка поделились знаниями. +1 и слава за это.
ZeFree
1

Ушел с Python, хотя GWT кажется идеально подходящим для приложений, которые я разрабатываю. JPA довольно запутан в GAE (например, нет @Embeddable и других неясных недокументированных ограничений). Потратив неделю, я могу сказать, что Java сейчас не совсем подходит для GAE.

Янченко
источник
1

Одна мысль, которую нужно принять во внимание, - это фреймворки, которые вы собираетесь использовать. Не все фреймворки на стороне Java хорошо подходят для приложений, работающих на App Engine, который несколько отличается от традиционных серверов приложений Java.

Необходимо учитывать время запуска приложения. С традиционными веб-приложениями на Java вам не нужно об этом думать. Приложение запускается, а затем просто запускается. Не имеет значения, если запуск занимает 5 секунд или пару минут. С App Engine вы можете оказаться в ситуации, когда приложение запускается только при поступлении запроса. Это означает, что пользователь ожидает загрузки вашего приложения. Здесь помогают новые функции GAE, такие как зарезервированные экземпляры, но сначала проверьте.

Другое дело, разные ограничения GAE psoes на Java. Не все фреймворки довольны ограничениями на то, какие классы вы можете использовать или тем, что потоки не разрешены или что вы не можете получить доступ к локальной файловой системе. Эти проблемы, вероятно, легко обнаружить, просто взглянув на совместимость с GAE.

Я также видел, как некоторые люди жалуются на проблемы с размером сеанса в современных средах пользовательского интерфейса (а именно Wicket). В общем, эти структуры имеют тенденцию делать определенные компромиссы, чтобы сделать разработку веселой, быстрой и легкой. Иногда это может привести к конфликтам с ограничениями App Engine.

Сначала я начал разрабатывать GAE с Java, но затем перешел на Python по этим причинам. Мое личное ощущение , что Python является лучшим выбором для разработки App Engine. Я думаю, что Java больше "дома", например, на Elastic Beanstalk от Amazon.

НО с App Engine все меняется очень быстро. GAE меняется сам по себе, и по мере того как он становится все более популярным, платформы также меняются, чтобы обойти его ограничения.

Юха Паломяки
источник