Вибір 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.


тепер Google App Engine підтримує Go (експериментальний). Які ваші думки щодо цього?
Бенджамін Крозьє

@pinouchon Я почав використовувати Go і розгорнув це у виробництві на GAE. GO дуже добре працює на GAE, збирається за кілька секунд. Виберіть розумний веб-фреймворк :-)
Мішель Джузеппе Фадда,

Відповіді:


123

Я упереджений (будучи експертом Python, але досить іржавий у Java), але я думаю, що час роботи GAE Python в даний час є більш розвинутим і краще розвинутим, ніж час виконання Java - колишній мав ще один рік, щоб розвиватися і дозріти, зрештою .

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

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

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

Щодо продуктивності, я думаю, що це помилка, хоча вам слід орієнтуватися на власні завдання - не покладайтеся на ефективність високооптимізованих реалізацій JVM на основі JIT, знижуючи їх великі час запуску та слід пам’яті, оскільки двигун програми навколишнє середовище сильно відрізняється (витрати на запуск виплачуються часто, оскільки екземпляри вашої програми запускаються, зупиняються, переміщуються до різних хостів тощо), все, мабуть, для вас - такі події, як правило, набагато дешевші в середовищі виконання Python, ніж у JVM).

Ситуація XPath / XSLT (бути евфемістичною ...) не зовсім ідеальна в обидві сторони, зітхання, хоча я думаю, що це може бути менш поганим в JVM (де, мабуть, значні підмножини Saxon можуть працювати , з певною обережністю). Я думаю, що варто відкрити випуски з питань видання з XPath та XSLT у своїх заголовках - зараз є лише проблеми із запитом конкретних бібліотек, і це короткозорість: мені не дуже важливо, як реалізується хороший XPath / XSLT, для Python та / або для Java, доки я нею користуюся. (Конкретні бібліотеки можуть полегшити міграцію існуючого коду, але це менш важливо, ніж можливість виконувати такі завдання, як "швидке застосування XSLT-перетворення" якось! -). Я знаю, що зіткнувся б із такою проблемою, якщо це добре сформульовано (особливо в незалежно від мови).

І останнє, але не менш важливе: пам’ятайте, що ви можете мати різні версії свого додатка (використовуючи один і той самий сховище даних), деякі з яких реалізовані під час виконання Python, деякі з режимом виконання Java, і ви можете отримати доступ до версій, які відрізняються від "за замовчуванням / активним" "один із явними URL-адресами. Таким чином, ви можете використовувати і Python, і Java-код (у різних версіях програми) та змінювати один і той же сховище даних, надаючи вам ще більшу гнучкість (хоча лише одна матиме "приємну" URL-адресу, наприклад foobar.appspot.com - що, мабуть, важливо лише для доступу інтерактивних користувачів до браузерів, я думаю ,--).


9
GWT - це насамперед клієнтська технологія - ви можете використовувати її незалежно від того, чи є ваш задній кінець python чи java. Ви втрачаєте трохи синтаксичного цукру за рахунок того, щоб робити RPC над JSON, а не вбудованим у RPC GWT, але якщо ви ненавидите JS і робите пітон, то все-таки варто подивитися :)
Peter Recore

9
Піжама ( pyjs.org ) є пітонічною альтернативою GWT - вона займе Python-код і компілює його в Javascript, як GWT робить для Java-коду.
Дейв Кірбі

7
Просто, щоб дати перспективу "на 5 років пізніше". Як розробник Java, мені здається, що GAE працює із застарілим стеком. Підтримку Java 8 ви не знайдете (на них працює Java 6 , а також застарілий контейнер Jetty 6 з API 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
У вашій програмі він видає внутрішню помилку сервера.
tomdemuyt

1
Спасибі Томе. На жаль, не моя програма. Надішліть поштою когось, з яким може бути пов’язано.
Річард Уотсон

1
Я хотів би побачити, як об’єктивізує порівняння в цьому тесті
Моше Шахам

18

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

Що стосується наявних бібліотек, ви побачите, що значна частина великої бібліотеки виконання Python працює нестандартно (як і у Java). Популярна веб-рамка Django ( http://www.djangoproject.com/ ) також підтримується в AppEngine.

Що стосується "влади", важко зрозуміти, що ви маєте на увазі, але Python використовується в багатьох різних областях, особливо в Інтернеті: YouTube написаний на Python, як і Sourceforge (станом на минулий тиждень).


Дякую Джуді2К! Під силою я маю на увазі, що я можу зробити більше речей і легко розширити.
В'єт,

15

Червень 2013: Це відео - це дуже хороша відповідь від інженера Google:

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

TLDR; є:

  • Виберіть мову, якою ви та ваша команда найбільш продуктивні
  • Якщо ви хочете створити щось для виробництва: Java або Python (не йти)
  • Якщо у вас є велика команда та складна база коду: Java (через статичний аналіз коду та рефакторинг)
  • Невеликі команди, які швидко повторюють: Python (хоча з Java теж нормально)

9

Важливим питанням, яке слід враховувати при вирішенні між Python та Java, є те, як ви будете використовувати сховище даних на кожній мові (і більшість інших кутів до початкового питання вже досить висвітлено в цій темі).

Для Java стандартним методом є використання JDO або JPA. Вони чудово підходять для портативності, але не дуже добре підходять для зберігання даних.

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

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

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

Для Java , API низького рівня використовується для розробки бібліотек стійкості, які набагато краще підходять до сховища даних, ніж JDO / JPA (IMO). Приклади включають проект "Сієна" та " Об'єктивувати" .

Нещодавно я почав використовувати 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. API Memcache: Java SDK має більш цікаві здібності, ніж Python SDK.
  4. API зберігання даних: JDO дуже повільний, але рідний API зберігання даних Java дуже швидкий і простий.

Я зараз використовую Java / GAE в розробці.


1
@Paul - чи могли б ви порекомендувати (або надати посилання на) найкращий спосіб впоратись із наполегливістю за допомогою Java в GAE, якщо JDO - це не шлях?
Марк

1
@ Марк, вибачте за затримку. Я думаю, що code.google.com/p/objectify-appengine - це найкращий вибір на даний момент.
Пол

7
-1 для відвертих неправди в пунктах №2 та №3 та №4 не має сенсу.
Триптих

@Triptych, дайте мені знати, як називається процесор XSLT для python / GAE? І що таке еквівалент операції CAS (putIfUntouched) для memcache / python / GAE?
Павло

1
@Paul, якби ти хотів, щоб я розглядав ці речі як частину вашої відповіді, ти повинен був би включити їх у свою відповідь. Натомість ви включаєте рядок напівправди. Ніхто не вибирає мову на основі кутових справ, які ви зараз придумали.
Триптих

6

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

EDIT: Я бачу, ви знайшли такий список

Я не можу коментувати виступ Python. Однак JVM - це дуже потужна платформа, враховуючи його здатність динамічно компілювати та оптимізувати код під час виконання.

У кінцевому рахунку продуктивність буде залежати від того, що робить ваша програма та як ви її кодуєте. За відсутності додаткової інформації, я думаю, що в цій області більше не можна давати вказівки.


Дякую за швидку відповідь, Брайан. Я маю намір зосередити увагу на застосуванні URL-адреси та розбору XML та обробки XSLT. Подавати вміст HTTP браузерам буде менше.
В'єт

6

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


5

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

Як я зазвичай роблю в цьому вигляді дилеми, я шукаю номери, щоб підтримати своє рішення. Я вирішив піти з Python з багатьох причин, але в моєму випадку був один сюжет, який був переломним. Якщо ви будете шукати "Google App Engine" в GitHub станом на вересень 2014 року , ви знайдете таку цифру:

Мовна статистика GAE

У цих числах може бути багато ухилів, але загалом сховища GAE Python втричі більше, ніж сховища GAE Java. Мало того, але якщо ви будете перераховувати проекти за "кількістю зірок", ви побачите, що більшість проектів Python з'являються вгорі (ви повинні врахувати, що Python вже довший). Для мене це є серйозною справою для Python, оскільки я враховую прийняття та підтримку спільноти, документацію та наявність проектів з відкритим кодом.


3

Це гарне запитання, і я думаю, що багато відповідей дали хороші точки зору за і проти обох сторін забору. Я спробував як на Python, так і на базі JVM AppEngine (в моєму випадку я використовував Gaelyk, що є рамкою додатків Groovy, створеною для AppEngine). Що стосується продуктивності на платформі, одне, що я не розглядав, поки воно не дивилось мені в обличчя, - це під назвою "Запит на завантаження", який виникає на стороні Java від забору. Під час використання Groovy ці запити на завантаження є вбивцями.

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


3

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


7
Я чув, що власники Ford скаржаться на свої машини набагато більше, ніж власники Koenigsegg. Чому це могло бути?
Аксарідакс

2

Є також проект " Ластівка без навантаження" , який, очевидно, фінансується Google, якщо не належить Google. Вони намагаються реалізувати на основі LLVM бекенд для байт-коду Python 2.6.1, щоб вони могли використовувати JIT та різні приємні натурні коди / GC / багатоядерні оптимізації. (Приємна цитата: "Ми прагнемо не робити оригінальних робіт, замість цього використовуємо якомога більше останніх 30 років досліджень.") Вони шукають 5-кратну швидкість до CPython.

Звичайно, це не відповідає на ваше найближче запитання, але вказує на "закриття прогалини" (якщо така є) у майбутньому (сподіваємось).


1
Ластівка Ластівка тепер мертвий проект, і остання фіксація - понад рік .
thepang

2

Краса пітона в наші дні полягає в тому, наскільки добре він спілкується з іншими мовами. Наприклад, ви можете мати як python, так і java на одному столі з Jython. Звичайно, jython, хоча він повністю підтримує бібліотеки java, він не підтримує повністю бібліотеки python. Але це ідеальне рішення, якщо ви хочете возитися з Java-бібліотеками. Це навіть дозволяє змішувати його з кодом Java без додаткового кодування.

Але навіть сам пітон зробив деякі кроки, що пропали. Дивіться, наприклад, типи, поблизу швидкості С, безпосередньо до них звертайтесь до бібліотек C, не залишаючи комфорту кодування python. Cython піде на крок далі, дозволяючи легко змішувати код c з кодом python, або навіть якщо ви не хочете возитися з c або c ++, ви все одно можете кодувати в python, але використовувати змінні типу статичного типу, що робить ваші програми python такими ж швидкими, як програми C . Google до речі використовує і підтримує Google Cython.

Вчора я навіть знайшов інструменти для python для вбудовування C або навіть збірки (див. CorePy), ви не можете отримати будь-який потужніший за це.

Python, безумовно, дуже зріла мова, яка не тільки стоїть на собі, але вміє легко співпрацювати з будь-якою іншою мовою. Я думаю, що саме це робить python ідеальним рішенням навіть у дуже просунутих та вимогливих сценаріях.

За допомогою python ви можете мати доступ до C / C ++, Java, .NET та багатьох інших бібліотек з майже нульовим додатковим кодуванням, що дає вам також мову, яка мінімізує, спрощує та прикрашає кодування. Це дуже спокуслива мова.


Питання стосується java vs python на GAE, який має чимало обмежень. Отже, ваші аргументи не застосовуються.
Даніяр

Я погоджуюся з @Daniyar, що ця відповідь трохи (або, можливо, цілком) відбивається, але мені подобається відповідь, і це було щось, що я шукав. Дякую Кілону, що поділився цими знаннями. Можливо, це було неправильне місце, але ви неодмінно обмінялися знаннями. +1 і кудо за це.
zeFree

1

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


1

Слід враховувати рамки, які ви збираєтесь використовувати. Не всі рамки на стороні Java добре підходять для програм, що працюють на App Engine, який дещо відрізняється від традиційних серверів додатків Java.

Одне, що слід врахувати, - це час запуску програми. З традиційними веб-програмами Java вам не потрібно думати про це. Запуск програми, а потім просто запуск. Не важливо, якщо запуск займає 5 секунд або пару хвилин. З App Engine ви можете опинитися в ситуації, коли додаток запускається лише після надходження запиту. Це означає, що користувач чекає, поки ваша програма завантажиться. Тут допомагають нові функції GAE, як зарезервовані екземпляри, але спочатку перевірте.

Інша справа - різні обмеження псосів GAE на Java. Не всі рамки задоволені обмеженнями в тому, які класи ви можете використовувати, або тим, що потоки заборонені або що ви не можете отримати доступ до локальної файлової системи. Ці проблеми, мабуть, легко з’ясувати, лише гуглюючи про сумісність з GAE.

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

Я спочатку почав розробляти роботу над GAE з Java, але потім перейшов на Python через ці причини. Моє особисте відчуття - Python є кращим вибором для розробки App Engine. Я думаю, що Java більше "вдома", наприклад, на Amazo's Elastic Beanstalk.

АЛЕ з App Engine все змінюється дуже швидко. GAE змінюється сама по собі, і коли вона стає більш популярною, рамки також змінюються, щоб подолати свої обмеження.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.