Scegliendo Java vs Python su Google App Engine


161

Attualmente Google App Engine supporta sia Python che Java. Il supporto Java è meno maturo. Tuttavia, Java sembra avere un elenco più lungo di librerie e in particolare il supporto per il bytecode Java indipendentemente dalle lingue utilizzate per scrivere quel codice. Quale lingua darà prestazioni migliori e più potenza? Si prega di avvisare. Grazie!

Modifica: http://groups.google.com/group/google-appengine-java/web/will-it-play-in-app-engine?pli=1

Modifica: per "potenza" intendo una migliore espandibilità e inclusione delle librerie disponibili al di fuori del framework. Python consente tuttavia solo librerie Python pure.


ora Google App Engine supporta Go (sperimentale). Di cosa ti occupi?
Benjamin Crouzier,

@pinouchon Ho iniziato a usare Go e l'ho distribuito in produzione su GAE. GO funziona molto bene su GAE, si compila in pochi secondi. Scegli saggiamente il tuo framework web :-)
Michele Giuseppe Fadda,

Risposte:


123

Sono di parte (essendo un esperto di Python ma piuttosto arrugginito in Java) ma penso che il runtime Python di GAE sia attualmente più avanzato e meglio sviluppato rispetto al runtime Java - il primo ha avuto un anno in più per svilupparsi e maturare, dopo tutto .

Ovviamente è difficile prevedere in che modo procederanno le cose: la domanda è probabilmente più forte dal lato Java (soprattutto perché non si tratta solo di Java, ma anche di altre lingue arroccate su JVM, quindi è IL modo di eseguire ad es. PHP o codice Ruby su App Engine); il team di Python App Engine ha tuttavia il vantaggio di avere a bordo Guido van Rossum, l'inventore di Python e un ingegnere incredibilmente forte.

In termini di flessibilità, il motore Java, come già accennato, offre la possibilità di eseguire il bytecode JVM realizzato da lingue diverse, non solo Java - se ti trovi in ​​un negozio multilingue che è piuttosto positivo. Viceversa, se detesti Javascript ma devi eseguire un po 'di codice nel browser dell'utente, il GWT di Java (che genera JavaScript per te dalla tua codifica a livello Java) è molto più ricco e più avanzato rispetto alle alternative lato Python (in pratica, se scegli Python, scriverai un po 'di JS per questo scopo, mentre se scegli Java GWT è un'alternativa utilizzabile se detesti scrivere JS).

In termini di librerie è praticamente un lavaggio: la JVM è abbastanza limitata (nessun thread, nessun caricatore di classi personalizzato, nessun JNI, nessun DB relazionale) per ostacolare il semplice riutilizzo delle librerie Java esistenti tanto quanto, o più, rispetto a Python esistente le librerie sono analogamente ostacolate dalle restrizioni simili sul runtime di Python.

In termini di prestazioni, penso che sia un lavaggio, anche se dovresti fare un benchmark su attività per conto tuo - non fare affidamento sulle prestazioni di implementazioni JVM basate su JIT altamente ottimizzate che scontano i loro grandi tempi di avvio e footprint di memoria, perché il motore dell'app l'ambiente è molto diverso (i costi di avvio verranno pagati spesso, poiché le istanze della tua app vengono avviate, arrestate, spostate su host diversi, ecc., tutto in modo trasparente per te - tali eventi sono in genere molto più economici con gli ambienti di runtime Python rispetto alle JVM).

La situazione XPath / XSLT (essere eufemistici ...) non è esattamente perfetta su entrambi i lati, sospiro, anche se penso che potrebbe essere un po 'meno male nella JVM (dove, a quanto pare, si possono far funzionare sottoinsiemi sostanziali di Saxon , con una certa cura). Penso che valga la pena aprire i problemi sulla pagina dei problemi di Appengine con XPath e XSLT nei loro titoli - in questo momento ci sono solo problemi che richiedono librerie specifiche, ed è miope: non mi interessa davvero COME sia implementato un buon XPath / XSLT, per Python e / o per Java, purché riesca a usarlo. (Librerie specifiche possono facilitare la migrazione del codice esistente, ma è meno importante che essere in grado di eseguire attività come "applicare rapidamente la trasformazione XSLT" in QUALUNQUE modo! -). So che sarei il protagonista di questo problema se ben definito (soprattutto in modo indipendente dalla lingua).

Ultimo ma non meno importante: ricorda che puoi avere versioni diverse dell'app (usando lo stesso archivio dati) alcune delle quali sono implementate con il runtime Python, alcune con il runtime Java e puoi accedere a versioni diverse da "default / active "uno con URL espliciti. Quindi potresti avere sia il codice Python che il codice Java (in diverse versioni della tua app) utilizzare e modificare lo stesso archivio dati, garantendo una flessibilità ancora maggiore (anche se solo uno avrà l'URL "carino" come foobar.appspot.com - che è probabilmente importante solo per l'accesso degli utenti interattivi sui browser, immagino ;-).


9
GWT è principalmente una tecnologia lato client: puoi usarla indipendentemente dal fatto che il tuo back-end sia Python o Java. Perdi un po 'di zucchero sintattico dovendo fare rpc su JSON piuttosto che su RPC integrato in GWT, ma se odi JS e fai pitone vale comunque la pena dare un'occhiata :)
Peter Recore,

9
C'è Pyjamas ( pyjs.org ) come alternativa Pythonic a GWT - prenderà il codice Python e lo compilerà in Javascript, proprio come GWT fa per il codice Java.
Dave Kirby,

7
Giusto per dare una prospettiva "5 anni dopo". Come sviluppatore Java, sento che GAE stia eseguendo uno stack obsoleto. Non troverai il supporto Java 8 , ( stanno eseguendo Java 6 e il contenitore Jetty 6 legacy con Servlet API 2.5 ), tutto sommato Il supporto Java in GAE è ancora bloccato nel 2010. Mentre adoro la semplicità GAE e Google Powerful Services, Non posso raccomandare GAE per Java fino a quando non aggiornano il suo stack.
Anthony Accioly,

72

Guarda questa app per le modifiche alle prestazioni di Python e Java:

http://gaejava.appspot.com/ (modifica: scuse, il link è interrotto ora. Ma il seguente para è ancora applicato quando l'ho visto in esecuzione per ultimo)

Attualmente, Python e l'utilizzo dell'API di basso livello in Java sono più veloci di JDO su Java, per questo semplice test . Almeno se il motore sottostante cambia, quell'app dovrebbe riflettere i cambiamenti delle prestazioni.


5
Con tutto il rispetto, trovo questo test abbastanza semplice da essere insignificante. Per quello che vale ... Se usi Java / GAE, ti consiglio di usare l'API di basso livello ed evitare JDO o qualsiasi altro framework. Ancora più importante, JDO ti dà la "sensazione" di lavorare con un database relazionale, che può essere "fuorviante".
Mo'in Creemers,

1
Sono d'accordo sull'evitare JDO, in parte per il motivo che dici, ma anche perché è più lento di basso livello. (Che il test generalmente mostra.) Indica semplicemente che ci sono differenze di prestazioni, quindi non usare JDO o test per il tuo compito specifico. Ho spostato tutto il mio codice da JDO e l'API di basso livello in Objectify. E in ogni caso, mostra anche che Python non è certo il povero cugino delle prestazioni su GAE.
Richard Watson,

1
La tua app sta generando un errore interno del server.
tomdemuyt,

1
Grazie Tom. Non la mia app, purtroppo. Ho inviato qualcuno che potrebbe essere collegato.
Richard Watson,

1
mi piacerebbe vedere come oggettivamente si confronta in questo test
Moshe Shaham,

18

In base all'esperienza con l'esecuzione di queste macchine virtuali su altre piattaforme, direi che probabilmente otterrai più prestazioni raw da Java di Python. Non sottovalutare i punti di forza di Python, tuttavia: il linguaggio Python è molto più produttivo in termini di righe di codice - l'accordo generale è che Python richiede un terzo del codice di un programma Java equivalente, pur rimanendo come o più leggibile. Questo vantaggio si moltiplica per la capacità di eseguire immediatamente il codice senza una fase di compilazione esplicita.

Per quanto riguarda le librerie disponibili, scoprirai che gran parte della vasta libreria di runtime di Python è pronta all'uso (come fa Java). Il famoso framework Web Django ( http://www.djangoproject.com/ ) è supportato anche su AppEngine.

Per quanto riguarda il "potere", è difficile sapere cosa intendi, ma Python è utilizzato in molti domini diversi, in particolare il Web: YouTube è scritto in Python, così come Sourceforge (a partire dalla scorsa settimana).


Grazie Judy2K! Con il potere intendo può fare più cose e facile da estendere.
Viet,

15

Giugno 2013: questo video è un'ottima risposta di un ingegnere di Google:

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

TLDR; è:

  • Scegli la lingua con cui tu e il tuo team siete più produttivi
  • Se vuoi creare qualcosa per la produzione: Java o Python (non vai)
  • Se hai una grande squadra e una base di codice complessa: Java (a causa dell'analisi del codice statico e del refactoring)
  • Piccoli team che ripetono rapidamente: Python (anche se Java va bene)

9

Una domanda importante da considerare nel decidere tra Python e Java è come userete il datastore in ogni lingua (e la maggior parte degli altri aspetti della domanda originale sono già stati trattati abbastanza bene in questo argomento).

Per Java , il metodo standard è utilizzare JDO o JPA. Questi sono ottimi per la portabilità ma non sono molto adatti all'archivio dati.

È disponibile un'API di basso livello ma questo è troppo basso per l'uso quotidiano - è più adatto per la creazione di librerie di terze parti.

Per Python esiste un'API progettata specificamente per fornire alle applicazioni un accesso semplice ma potente all'archivio dati. È fantastico, tranne che non è portatile, quindi ti blocca in GAE.

Fortunatamente, ci sono soluzioni in fase di sviluppo per i punti deboli elencati per entrambe le lingue.

Per Java , l'API di basso livello viene utilizzata per sviluppare librerie di persistenza che sono molto più adatte al datastore rispetto a JDO / JPA (IMO). Esempi includono il progetto Siena e Objectify .

Di recente ho iniziato a utilizzare Objectify e lo trovo molto facile da usare e adatto all'archivio dati, e la sua crescente popolarità si è tradotta in un buon supporto. Ad esempio, Objectify è ufficialmente supportato dal nuovo servizio Cloud Endpoint di Google. D'altra parte, Objectify funziona solo con l'archivio dati, mentre Siena è "ispirata" dall'archivio dati ma è progettata per funzionare con una varietà di database SQL e archivi dati NoSQL.

Per Python , ci sono sforzi per consentire l'uso dell'API di archivio dati Python GAE al di fuori di GAE. Un esempio è il backend SQLite che Google ha rilasciato per l'uso con l'SDK, ma dubito che intendano trasformarlo in qualcosa di pronto per la produzione. Il progetto TyphoonAE probabilmente ha più potenziale, ma non credo sia pronto per la produzione (correggimi se sbaglio).

Se qualcuno ha esperienza con una di queste alternative o conosce altri, per favore aggiungili in un commento. Personalmente, mi piace molto il datastore GAE - trovo che sia un notevole miglioramento rispetto ad AWS SimpleDB - quindi desidero il successo di questi sforzi per alleviare alcuni dei problemi nell'usarlo.


7

Consiglio vivamente Java per GAE ed ecco perché:

  1. Prestazioni: Java è potenzialmente più veloce di Python.
  2. Lo sviluppo di Python è sotto la pressione della mancanza di librerie di terze parti. Ad esempio, non esiste alcuna XSLT per Python / GAE. Quasi tutte le librerie Python sono associazioni C (e quelle non sono supportate da GAE).
  3. API Memcache: Java SDK ha abilità più interessanti di Python SDK.
  4. API del datastore: JDO è molto lenta, ma l'API del datastore Java nativa è molto semplice e veloce.

Sto usando Java / GAE in fase di sviluppo in questo momento.


1
@Paul - potresti consigliare (o fornire link a) il modo migliore per gestire la persistenza usando Java su GAE se JDO non è la strada da percorrere?
Segna il

1
@Mark, mi dispiace per il ritardo. Penso che code.google.com/p/objectify-appengine sia la scelta migliore per ora.
Paul,

7
-1 per le vere e proprie menzogne ​​ai punti 2 e 3 e per 4 non ha alcun senso.
Trittico

@Triptych, fammi sapere come si chiama il processore XSLT per Python / GAE? E qual è l'equivalente dell'operazione CAS (putIfUntouched) per memcache / python / GAE?
Paul

1
@Paul, se volevi che considerassi queste cose come parte della tua risposta, avresti dovuto includerle nella tua risposta. Invece, includi una serie di mezze verità. Nessuno sceglie una lingua in base ai casi d'angolo che stai inventando ora.
Trittico

6

Come hai identificato, l'uso di una JVM non ti limita all'uso del linguaggio Java. Un elenco di lingue e collegamenti JVM è disponibile qui . Tuttavia , Google App Engine limita il set di classi che è possibile utilizzare dal normale set Java SE e sarà necessario verificare se una di queste implementazioni può essere utilizzata sul motore dell'app.

EDIT: Vedo che hai trovato un tale elenco

Non posso commentare le prestazioni di Python. Tuttavia, JVM è una piattaforma molto potente dal punto di vista delle prestazioni, data la sua capacità di compilare e ottimizzare dinamicamente il codice durante il runtime.

In definitiva, le prestazioni dipenderanno dall'applicazione e dal modo in cui la codifichi. In assenza di ulteriori informazioni, penso che non sia possibile fornire ulteriori indicazioni in quest'area.


Grazie per la pronta risposta, Brian. Intendo concentrare l'applicazione sul recupero dell'URL e sull'analisi XML e sull'elaborazione XSLT. Ci sarà meno di offrire contenuto HTTP ai browser.
Viet,

6

Sono stato sorpreso da quanto sia pulito, semplice e senza problemi l'SDK Python / Django. Tuttavia, ho iniziato a imbattermi in situazioni in cui avevo bisogno di iniziare a fare più JavaScript e pensavo che avrei potuto approfittare del GWT e di altre utility Java. Sono passato a metà del tutorial GAE Java e ho avuto un problema dopo l'altro: problemi di configurazione di Eclipse, versionite JRE, complessità strabiliante di Java e un tutorial confuso e forse rotto. Dai un'occhiata a questo sito e ad altri linkati da qui. Sto tornando a Python e esaminerò il pigiama per aiutarmi con le mie sfide JavaScript.


5

Sono un po 'in ritardo per la conversazione, ma ecco i miei due centesimi. Ho davvero avuto difficoltà a scegliere tra Python e Java, dato che sono esperto in entrambe le lingue. Come tutti sappiamo, ci sono vantaggi e svantaggi per entrambi e devi tenere conto delle tue esigenze e dei quadri che funzionano meglio per il tuo progetto.

Come faccio di solito in questo tipo di dilemmi, cerco numeri per supportare la mia decisione. Ho deciso di andare con Python per molte ragioni, ma nel mio caso c'era una trama che era il punto di svolta. Se cerchi "Google App Engine" in GitHub a partire da settembre 2014 , troverai la seguente figura:

Statistiche linguistiche GAE

Potrebbero esserci molti pregiudizi in questi numeri, ma nel complesso ci sono tre volte più repository GAE Python rispetto ai repository Java GAE. Non solo, ma se elenchi i progetti in base al "numero di stelle" vedrai che la maggior parte dei progetti Python appare in alto (devi tenere conto del fatto che Python è in circolazione da più tempo). Per me, questo è un valido esempio per Python perché prendo in considerazione l'adozione e il supporto della comunità, la documentazione e la disponibilità di progetti open-source.


3

È una buona domanda e penso che molte delle risposte abbiano dato buoni punti di vista su pro e contro su entrambi i lati della barriera. Ho provato AppEngine basato su Python e JVM (nel mio caso stavo usando Gaelyk che è un framework di applicazioni Groovy creato per AppEngine). Quando si tratta di prestazioni sulla piattaforma, una cosa che non avevo considerato fino a quando non mi stava fissando in faccia è l'implicazione delle "Richieste di caricamento" che si verificano sul lato Java della barriera. Quando si utilizza Groovy queste richieste di caricamento sono un killer.

Ho messo insieme un post sull'argomento ( http://distractable.net/coding/google-appengine-java-vs-python-performance-comparison/ ) e spero di trovare un modo per aggirare il problema, ma in caso contrario, penso che tornerò a una combinazione Python + Django fino a quando le richieste java con avvio a freddo non avranno un impatto minore.


3

Sulla base di quanto sento le persone Java lamentarsi di AppEngine rispetto agli utenti Python, direi che Python è molto meno stressante da usare.


7
Ho sentito che i proprietari di Ford si lamentano molto più delle loro auto rispetto ai proprietari di Koenigsegg. Perché potrebbe essere?
Axarydax,

2

C'è anche il progetto Unladen Swallow , apparentemente finanziato da Google se non di proprietà di Google. Stanno cercando di implementare un back-end basato su LLVM per il bytecode Python 2.6.1, in modo da poter utilizzare un JIT e varie simpatiche ottimizzazioni con codice nativo / GC / multi-core. (Bella citazione: "Aspiriamo a non fare alcun lavoro originale, invece di utilizzare il maggior numero possibile degli ultimi 30 anni di ricerca.") Stanno cercando una velocità 5 volte superiore a CPython.

Naturalmente questo non risponde alla tua domanda immediata, ma indica una "chiusura del divario" (se presente) in futuro (si spera).


1
Unladen Swallow è ora un progetto morto e l'ultimo commit ha più di un anno .
Tshepang,

2

La bellezza di Python oggi è quanto bene comunica con altre lingue. Ad esempio puoi avere sia Python che Java sulla stessa tabella con Jython. Naturalmente jython anche se supporta completamente le librerie java, non supporta le librerie completamente python. Ma è una soluzione ideale se vuoi fare confusione con le librerie Java. Ti permette anche di mescolarlo con il codice Java senza ulteriore codifica.

Ma anche lo stesso pitone ha fatto alcuni passi inosservati. Vedi ctypes per esempio, vicino alla velocità C, indirizza gli assi verso le librerie C tutto questo senza lasciare il comfort della codifica Python. Cython fa un ulteriore passo avanti, consentendo di mescolare facilmente il codice c con il codice python, o anche se non vuoi fare confusione con c o c ++, puoi comunque scrivere codice in python ma usare variabili di tipo statico che rendono i tuoi programmi python veloci quanto le app C . A proposito, Cython è utilizzato e supportato da Google.

Ieri ho anche trovato strumenti per Python per incorporare C o persino Assembly (vedi CorePy), non puoi ottenere più potente di così.

Python è sicuramente un linguaggio molto maturo, non solo in piedi su se stesso, ma in grado di cooperare con qualsiasi altra lingua con facilità. Penso che sia ciò che rende python una soluzione ideale anche in scenari molto avanzati ed esigenti.

Con Python puoi avere accesso a C / C ++, Java, .NET e molte altre librerie con quasi zero codifica aggiuntiva che ti dà anche un linguaggio che minimizza, semplifica e abbellisce la codifica. È un linguaggio molto allettante.


La domanda riguarda java vs python su GAE, che ha molte restrizioni. Quindi, i tuoi argomenti sono inapplicabili.
Daniyar,

Sono d'accordo con @Daniyar, che questa risposta è un po '(o forse totalmente) fuori dai battiti, ma mi piace la risposta e questo era qualcosa che stavo cercando. Grazie Kilon per aver condiviso questa conoscenza. Può essere che questo fosse il posto sbagliato, ma sicuramente hai fatto un po 'di condivisione delle conoscenze. +1 e complimenti per quello.
zeFree

1

Andato con Python anche se GWT sembra una corrispondenza perfetta per il tipo di app che sto sviluppando. JPA è piuttosto incasinato su GAE (ad es. No @Embeddable e altre oscure limitazioni non documentate). Avendo trascorso una settimana, posso dire che Java al momento non si sente proprio su GAE.


1

Uno pensa di prendere in considerazione i framework che intendi utilizzare. Non tutti i framework sul lato Java sono adatti per le applicazioni in esecuzione su App Engine, che è in qualche modo diverso dai server di app Java tradizionali.

Una cosa da considerare è il tempo di avvio dell'applicazione. Con le app Web Java tradizionali non devi davvero pensarci. L'applicazione si avvia e quindi viene eseguita. Non importa se l'avvio richiede 5 secondi o un paio di minuti. Con App Engine potresti ritrovarti in una situazione in cui l'applicazione viene avviata solo quando arriva una richiesta. Ciò significa che l'utente è in attesa all'avvio dell'applicazione. Le nuove funzionalità GAE come le istanze riservate aiutano qui, ma controlla prima.

Un'altra cosa sono i diversi limiti GAE psoes su Java. Non tutti i framework sono soddisfatti delle limitazioni su quali classi è possibile utilizzare o sul fatto che i thread non sono consentiti o che non è possibile accedere al filesystem locale. Questi problemi sono probabilmente facili da scoprire semplicemente googling sulla compatibilità GAE.

Ho anche visto alcune persone lamentarsi di problemi con la dimensione della sessione su moderni quadri dell'interfaccia utente (Wicket, in particolare). In generale, questi quadri tendono a fare alcuni compromessi per rendere lo sviluppo divertente, veloce e facile. A volte ciò può causare conflitti con le limitazioni di App Engine.

Inizialmente ho iniziato a lavorare su GAE con Java, ma poi sono passato a Python per questi motivi. La mia sensazione personale è che Python sia una scelta migliore per lo sviluppo di App Engine. Penso che Java sia più "a casa", ad esempio su Elastic Beanstalk di Amazon.

MA con App Engine le cose stanno cambiando molto rapidamente. GAE sta cambiando se stesso e man mano che diventa più popolare, anche i framework stanno cambiando per aggirare i suoi limiti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.