Produttività Python VS Produttività Java


24

Su SO mi sono imbattuto in una domanda su quale piattaforma, Java o Python è la migliore per lo sviluppo su Google AppEngine. Molte persone si vantano della maggiore produttività ottenuta dall'uso di Python su Java. Una cosa che direi sull'argomento della produttività tra Python e Java, è che Java ha eccellenti IDE per accelerare lo sviluppo in cui Python è davvero carente in quest'area a causa della sua natura dinamica.

Quindi, anche se preferisco usare Python come linguaggio, non credo che dia un notevole incremento della produttività rispetto a Java, specialmente quando si usa un nuovo framework. Ovviamente se si trattasse di Java vs Python e l'unico editor che potessi usare fosse VIM, allora Python ti darebbe un enorme incremento di produttività ma quando gli IDE vengono portati nell'equazione non è così chiaro.

Penso che i meriti di Java siano spesso valutati esclusivamente a livello linguistico e spesso su presupposti obsoleti, ma Java ha molti vantaggi esterni al linguaggio stesso, ad esempio la JVM (spesso criticata ma offre un enorme potenziale), IDE e strumenti eccellenti, un numero enorme di terzi librerie di feste, piattaforme ecc.

Domanda, Python / i linguaggi dinamici correlati danno davvero l'enorme aumento della produttività di cui spesso si parla? (tenendo in considerazione l'utilizzo di nuovi framework e il lavoro con applicazioni medio-grandi).


2
Dai un'occhiata all'IDE di PyCharm. Ma credo anche che ci sia un nuovo framework per GAE che converte il codice Java in JavaScript per l'uso sul front-end, il che potrebbe essere un grande aumento di produttività.
Andrew M

14
IDE o no, devi ancora scrivere 10 righe di Java per alcune cose che possono essere fatte (bene) in una riga di Python.

2
Non vergognarti del tuo amore per Java. Hai imparato alcuni trucchi (IDE, librerie e framework) che ti consentono di calciare i calci. Abbraccialo. Non hai bisogno del nostro permesso per essere fantastico. Se Java ti rende produttivo, allora è abbastanza.
Scorp Roger Roger

1
1) Il potenziale JVM è molto limitato . Deliberatamente. Non è "cattivo", è solo, beh, limitante. 2) Gli IDE possono aiutare solo se tutto ciò che fai è integrare centinaia dei componenti esistenti (che è un tipo valido e onorato di programmazione, ma non l'unico). Quando si tratta di implementare algoritmi complessi, Python è molto più produttivo di Java (anche cose come le funzioni lambda e la comprensione delle liste fanno una grande differenza).
SK-logic,

1
Se la tua produttività è notevolmente aumentata dal tuo IDE, allora è probabile che ci sia qualcosa di terribilmente sbagliato in te o nella tua piattaforma di programmazione. (Smalltalk è l'eccezione, perché crea un sistema totalmente riflettente per la programmazione).
Marcin,

Risposte:


18

Uno dei maggiori vantaggi di Python è la sua filosofia "batterie incluse": una libreria standard ampia e semplice da usare. In Java, la sola lettura di un file di testo richiede diverse righe di codice, lettori nidificati e simili. In Python lo è f.read(). Questo sarà sicuramente un enorme aumento della produttività soprattutto nella prototipazione rapida. Python il linguaggio è anche generalmente meno prolisso, il che non è una cosa negativa (anche se penso che l'importanza della verbosità rispetto alla concisione sia spesso enfatizzata).

Tuttavia, se stai già lavorando su un framework, come GAE, mi aspetterei che le differenze siano molto più piccole, e principalmente fino alla fluidità personale nella lingua. Per lo più collegherai semplicemente il framework con la sintassi di tua scelta, e la grande libreria standard di Python aiuta poco.


Ho davvero bisogno di imparare come usare GAE. Qualche serie di tutorial online che consiglieresti? Sono familiarità con Python, ma non hanno un indizio circa GAE. Grazie!


4
Oppure puoi aggiungere Apache Commons IO con una riga di Maven config e quindi leggere anche i file in una riga. L'approccio delle batterie incluso è un'arma a doppio taglio per me.
jiggy,

@jiggy: sono d'accordo in una certa misura; Le batterie di Python sono quasi sempre utili e spesso sufficienti, ma ovviamente la libreria standard non può soddisfare tutti i possibili scopi, quindi a volte è necessario ricorrere alle librerie.
Joonas Pulakka,

2
La lettura di un file di testo in Java: List<String> lines = Files.readAllLines(Paths.get("file.txt"), Charset.forName("UTF-8"));. Non male! (Questo è Java 7 che non è stato ancora rilasciato l'11 marzo).
assylias,

19

Ecco i miei 2 centesimi. Nella mia esperienza Python è buono per progetti di piccole e medie dimensioni, mentre per progetti più grandi sono più produttivo con Java.

In generale, posso usare un linguaggio tipizzato in modo dinamico come Python (o PHP) per progetti più piccoli: non è troppo complesso, vuoi farlo velocemente e non c'è troppo che possa andare storto. In questo caso, trovo che Python possa essere più pratico da usare.

Tuttavia, quando devo sviluppare un software più grande, preferisco un linguaggio tipicamente statico come Java perché preferisco che il compilatore esegua il maggior numero di controlli possibile per me. La mia esperienza è che in progetti più grandi devo dedicare più tempo a correggere i bug con Python che con Java, quindi non mi preoccupo se ci vuole un po 'di più per scrivere il codice in Java perché ciò farà risparmiare tempo in seguito.


6
+1, pienamente d'accordo. Adoro usare Python e linguaggi simili su progetti più piccoli in cui posso avvolgere la testa attorno al loro intero ambito senza troppi problemi. Il problema si presenta in progetti più grandi in cui è necessario dedurre le interfacce tra i componenti. Questo, combinato con un supporto di refactoring più debole, mi rende meno fiducioso nella produzione di sistemi grandi, stabili e mantenibili. Molti test devono essere scritti e mantenuti, solo per compensare la mancanza di analisi statiche eseguite dal compilatore. Quando arriva a questo punto, il vantaggio della rapida iterazione iniziale viene perso in termini di manutenzione.
bunglestink l'

Uso entrambi e mi piacciono entrambi. Sono pienamente d'accordo con te.
Daniel Baktiar,

11

Sono molto più produttivo in linguaggi più potenti come Python o Ruby. Non importa se parte del codice Java può essere generato da un IDE. C'è più codice da leggere e mantenere. Ci vuole più tempo per guadare attraverso il codice ripetitivo e trovare le parti importanti e più tempo per cambiarlo. Va bene che Eclipse può convertire

private Date dateOfBirth;

a:

private Date dateOfBirth;
public Date getDateOfBirth() { return dateOfDeath; }
public setDateOfBirth(Date d) { dateOfBirth = d; }

ma ogni volta che apro la classe vedrò quella spazzatura e dovrò sfogliarla per trovare le parti interessanti. Inoltre, durante la manutenzione, è possibile introdurre errori nel codice generato.

Preferirei di gran lunga vedere:

attr :date_of_birth

Per me, la necessità che un IDE funzioni in modo efficace con Java è una buona ragione per scegliere un'altra lingua.

Forse più efficacemente, confronta questo codice Ruby:

avg = people.filter { |p| p.height > 200 }.collect(:weight).average

con un codice Java simile:

List<Double> weights = new ArrayList<Double>();
for (Person p: people) {
  if (p.getHeight() > 200) {
    weights.add(p.getWeight());
  }
}
return Stats.average(weights);

Il codice Ruby è una traduzione diretta della specifica: il peso medio delle persone più alte di 200 (cm). Un commento sarebbe assolutamente ridondante.

Il codice Java richiede un lavoro considerevole sia per scrivere che per leggere.

Paul Graham fa un convincente argomento per brevità nei linguaggi di programmazione in questo saggio . Dopo aver fatto un po 'di matematica a livello universitario, trovo la sua argomentazione avvincente e le argomentazioni contro la brevità deboli. Certamente una singola riga in un linguaggio di alto livello può essere più difficile da comprendere rispetto a una singola riga in un linguaggio di basso livello, così come un'equazione differenziale parziale è più difficile da comprendere di una semplice aggiunta. Ma una singola riga in un linguaggio potente è più facile da comprendere rispetto alle cinque o dieci righe che sostituisce. Immagina di leggere un testo matematico che è stato scritto usando parole anziché simboli.


Non ho usato Python, ma ho usato C # che ha proprietà automatiche. Quanto lavoro in Python aggiunge la logica in questo (diciamo sparando un evento o una logica di validazione)?
mlk,

@mlk - L'affermazione "attr" è di Ruby. In Ruby è molto semplice associare il comportamento quando viene impostata una proprietà.
Kevin Cline,

In Python, tutti gli attributi di classe sono automaticamente pubblici, quindi la maggior parte delle volte accederai direttamente a loro.
Zhehao Mao,

3
Python non ha bisogno di getter o setter: basta renderlo dateOfBirthpubblico. Se la logica deve essere aggiunta successivamente ad get o set, aggiungere a _dateOfBirthper archiviare i dati, quindi creare un propertynome dateOfBirthcon entrambi i metodi get e set. Il codice chiamante non deve cambiare affatto in Python. Java utilizza solo accessori perché non ha il concetto di "proprietà".
Izkata,

1
Con Java 8 e stream il tuo codice di peso medio può essere scritto come tale:people.stream().filter(p -> p.getHeight() > 200).mapToDouble(Person::getWeight).average().orElse(0);
vitro

7

Mi sono trasferito da Java a Python alcuni anni fa e personalmente sento di essere più produttivo. Come sottolinea @Joonas, gran parte della produttività deriva dalla libreria di pacchetti. Ma alcuni provengono dalla stessa lingua. Non riesco a immaginare di non avere dizionari, comprensioni di elenchi, funzioni di ordine superiore e una shell.

Tieni presente che se conosci già Java ci vorrà un po 'per diventare fluente in Python.


7

Questa è una domanda un po 'vecchia, ma vorrei aggiungere i miei $ 0,03. Penso che dipenda molto dal modo in cui pensi anche tu. Io per uno non sopporto davvero i linguaggi dinamici e interpretati. Sono, invece, un grande fan delle lingue tipicamente statiche. Certo, usare Java può essere più dettagliato ma trovo più facile da leggere e mantenere una volta che tutto è stato detto e fatto. Trovo Python, Ruby e Perl estremamente difficili da leggere (per me). Non riesco proprio a avvolgerci la testa, anche se ci ho provato. Detto questo, posso scrivere codice alla Scala bene e non è un grosso problema. Penso che dipenda da cosa ti senti a tuo agio. Alla fine della giornata Java sarà molto più potente; più di Ruby, Python o Perl. JVM è una tecnologia avvincente e imparare a sfruttarne il potere potrebbe rivelarsi molto utile per te.


1
D'accordo, sicuro di poter hackerare Python molto velocemente ma può diventare un incubo il debug in seguito o l'aggiunta di nuove funzionalità, ecco perché spesso viene chiamato un "linguaggio di prototipazione" ed è proprio quello che ritengo utile (o per la pubblicità) tipo di script ad hoc)
programmx10

2
quando arriverà la fine di quel giorno? Aspettiamo da circa 20 anni e Java non ha ancora funzioni di prima classe o alcuna funzione di meta-programmazione. Nel frattempo C # ha fatto enormi progressi. Nell'ultimo anno ho iniziato a scrivere codice Groovy anziché Java e la mia produttività è aumentata enormemente. Il codice Groovy è molto più piccolo e più facile da capire rispetto al corrispondente codice Java perché il rumore è sparito.
Kevin Cline,

@Kevin Cline - So cosa stai dicendo - Sono stato uno sviluppatore .NET negli ultimi sei anni o qualcosa del genere. Non sto parlando solo di produttività, ma di semplici tempi di compilazione, concorrenza e elementi di tipo multicore. Java e JVM (Groovy, Scala, ecc.) JVM è la cosa più importante qui non necessariamente Java stesso.
Nodey The Node Guy,

2
@ programmx10 La manutenibilità del tuo codice Python dipende da come l'hai scritto. Se hai creato tutto in un grande kludge, ovviamente non sarai in grado di eseguirne il debug. Se, d'altra parte, hai organizzato bene il tuo codice e hai separato la tua funzionalità in moduli e classi, allora può essere altrettanto facile da mantenere (se non più semplice) del codice Java.
Zhehao Mao,

5

Trovo che Python, Ruby, Javascript e SQL siano molto più produttivi dei linguaggi compilati come Java perché quelle lingue hanno un ciclo di feedback molto rapido. È possibile eseguire alcune righe di codice su una riga di comando e sapere immediatamente se il codice è corretto o meno. Se genera eccezioni, lo sai immediatamente. Con Java devi compilare, impacchettare e distribuire che spesso può richiedere minuti per sistemi di grandi dimensioni, e questo si traduce in un ciclo di feedback molto lento.

Il rapido ciclo di feedback consente di passare rapidamente a una buona soluzione, ed è ciò che rende le lingue dinamiche più produttive.


grande applicazione del terminefeedback loop
anfibio,

3

Recentemente ho fatto molto più pitone e sono stato un programmatore Java per molto tempo, e per lo sviluppo nuovo di zecca, penso di essere un po 'più produttivo in Python. un sacco di cose abbastanza semplici in Java possono essere un po 'noiose, come l'elaborazione di file / stream, la lettura di contenuti da un URL, la serializzazione di XML, ecc. con "noioso", intendo che ciò che ti porta 5 righe di codice in Java spesso sembra prendine solo uno in pitone. usare gli strumenti giusti, come guava o un'altra API di raccolte, può davvero aiutare in questo.

Immagino che sto dicendo che un vantaggio di Python è che viene fornito con molte funzionalità che è necessario utilizzare una libreria di terze parti in Java per ottenere.

tutto ciò detto, per certe cose sarei molto più produttivo in Java di quanto non potrei essere in Python, in particolare quando si tratta di refactoring e lavoro con basi di codice di grandi dimensioni, ecc.


1
Java è tutto basato sulle librerie, con Python hanno un sacco di metodi, un po 'come fa PHP, in cui può essere difficile ricordarli tutti, con Java basta cercare la libreria appropriata e poi almeno scegliere a quello che usi
programmx10

1
@ programmx10 Di cosa stai parlando? Python ha molte librerie per ogni sorta di cose. Guarda la documentazione per la libreria standard. Le librerie Python sono separate in moduli, proprio come le librerie Java sono separate in pacchetti.
Zhehao Mao,
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.