Produktywność w języku Python a produktywność w języku Java

24

Na SO natknąłem się na pytanie, która platforma, Java lub Python jest najlepsza do programowania w Google AppEngine. Wiele osób chwaliło się zwiększoną produktywnością uzyskaną dzięki użyciu Pythona w Javie. Jedną rzeczą, którą chciałbym powiedzieć o argumentie produktywności Python vs Java, jest to, że Java ma doskonałe IDE do przyspieszenia rozwoju, w którym Python naprawdę brakuje w tym obszarze ze względu na jego dynamiczny charakter.

Nawet jeśli wolę używać Pythona jako języka, nie sądzę, że daje to znaczny wzrost wydajności w porównaniu z Javą, szczególnie przy użyciu nowego frameworka. Oczywiście, gdyby była to Java vs Python, a jedynym edytorem, którego można było użyć, był VIM, to Python dałby ci ogromny wzrost wydajności, ale kiedy IDE są wprowadzone do równania, nie jest to tak wyraźne.

Myślę, że zalety Javy są często oceniane wyłącznie na poziomie językowym i często na podstawie przestarzałych założeń, ale Java ma wiele korzyści poza samym językiem, np. JVM (często krytykowany, ale oferuje ogromny potencjał), doskonałe IDE i narzędzia, ogromna liczba trzecich biblioteki imprez, platformy itp.

Pytanie: Czy języki dynamiczne Python / pokrewne naprawdę dają ogromne wzrosty wydajności, o których często mówi się? (z uwzględnieniem nowych ram i pracy ze średnimi i dużymi aplikacjami).

toc777
źródło
2
Sprawdź PyCharm IDE. Ale wierzę też, że istnieje nowa platforma GAE, która konwertuje kod Java na JavaScript do użytku w interfejsie, co może być dużym wzrostem wydajności.
Andrew M
14
IDE czy nie, wciąż musisz napisać 10 linii Java dla niektórych rzeczy, które można zrobić (dobrze) w jednym wierszu Pythona.
2
Nie wstydź się miłości do Jawy. Nauczyłeś się kilku sztuczek (IDE, bibliotek i frameworków), które pozwalają kopać w tyłek. Przyjmij to. Nie potrzebujesz od nas pozwolenia, aby być niesamowitym. Jeśli Java sprawia, że jesteś produktywny, to wystarczy.
Scant Roger
1
1) Potencjał JVM jest bardzo ograniczony . Celowo. To nie jest „złe”, po prostu ogranicza się. 2) IDE może pomóc tylko wtedy, gdy wszystko, co robisz, to integracja setek istniejących komponentów (co jest poprawnym i honorowanym rodzajem programowania, ale nie jedynym). Jeśli chodzi o implementację złożonych algorytmów, Python jest o wiele bardziej produktywny niż Java (nawet takie rzeczy, jak funkcje lambda i interpretacja list mają ogromną różnicę).
SK-logic
1
Jeśli twoje IDE znacznie zwiększy twoją produktywność, są szanse, że coś jest z tobą lub z twoją platformą programistyczną. (Smalltalk jest wyjątkiem, ponieważ tworzy całkowicie refleksyjny system do programowania).
Marcin

Odpowiedzi:

18

Jedną z głównych zalet Pythona jest filozofia „dołączone baterie”: obszerna i prosta w użyciu standardowa biblioteka. W Javie samo czytanie pliku tekstowego wymaga kilku wierszy kodu, zagnieżdżonych czytników i tym podobnych. W Pythonie jest to f.read(). Z pewnością będzie to ogromny wzrost wydajności, szczególnie w przypadku szybkiego prototypowania. Język Pythona jest również ogólnie mniej gadatliwy, co nie jest złą rzeczą (chociaż myślę, że znaczenie gadatliwości kontra zwięzłości jest często przeceniane).

Jeśli jednak pracujesz już nad jakimś frameworkiem, takim jak GAE, spodziewam się, że różnice będą znacznie mniejsze, a przede wszystkim do osobistej płynności w języku. Przeważnie będziesz po prostu podłączał ramę do wybranej składni, a tam świetna standardowa biblioteka Pythona niewiele pomaga.

Joonas Pulakka
źródło
I naprawdę trzeba się nauczyć, jak korzystać z GAE. Jakieś serie samouczków online, które poleciłbyś? Jestem zaznajomiony z Pythona, ale nie mają pojęcia o GAE. Dzięki!
@Sergio: code.google.com/appengine/docs :-)
Joonas Pulakka
4
Możesz też dodać Apache Commons IO z linią konfiguracji Maven, a następnie odczytać pliki również w jednym wierszu. Podejście z bateriami to dla mnie obosieczny miecz.
jiggy
@jiggy: Zgadzam się do pewnego stopnia; Baterie Pythona są prawie zawsze przydatne i często wystarczające, ale oczywiście standardowa biblioteka nie jest w stanie zaspokoić wszystkich możliwych celów, więc czasami trzeba wracać do bibliotek.
Joonas Pulakka
2
Odczytywanie pliku tekstowego w Java: List<String> lines = Files.readAllLines(Paths.get("file.txt"), Charset.forName("UTF-8"));. Nieźle! (To jest Java 7, która nie została jeszcze wydana 11 marca).
assylias
19

Oto moje 2 centy. Z mojego doświadczenia wynika, że ​​Python jest dobry dla małych i średnich projektów, podczas gdy dla większych projektów jestem bardziej produktywny dzięki Javie.

Ogólnie rzecz biorąc, mogę używać dynamicznie pisanego języka, takiego jak Python (lub PHP), do mniejszych projektów: nie jest on zbyt skomplikowany, chcesz szybko to zrobić i nie ma zbyt wiele rzeczy, które mogą pójść źle. W tym przypadku uważam, że Python może być bardziej praktyczny w użyciu.

Jednak gdy muszę opracować większy program, wolę język o typie statycznym, taki jak Java, ponieważ wolę, aby kompilator przeprowadzał dla mnie jak najwięcej sprawdzeń. Z mojego doświadczenia wynika, że ​​w większych projektach spędzam więcej czasu na naprawianiu błędów w Pythonie niż w Javie, więc nie zawracam sobie głowy, jeśli napisanie kodu w Javie zajmuje trochę więcej, ponieważ pozwoli to zaoszczędzić czas później.

Giorgio
źródło
6
+1, całkowicie się zgadzam. Uwielbiam używać Pythona i podobnych języków w mniejszych projektach, w których mogę bez problemu owinąć głowę całym ich zasięgiem. Problem pojawia się w większych projektach, w których trzeba wnioskować o interfejsach między komponentami. To w połączeniu ze słabszym wsparciem w zakresie refaktoryzacji sprawia, że ​​jestem mniej pewny w produkcji dużych, stabilnych i łatwych w utrzymaniu systemów. Wiele testów musi zostać napisanych i przeprowadzonych, aby zrekompensować brak analizy statycznej przeprowadzanej przez kompilator. Kiedy dojdzie do tego punktu, korzyść z szybkiej początkowej iteracji zostanie utracona.
bunglestink
Używam obu i lubię oba. Całkowicie się z Tobą zgadzam.
Daniel Baktiar
11

Jestem znacznie bardziej produktywny w bardziej zaawansowanych językach, takich jak Python lub Ruby. Nie ma znaczenia, czy część kodu Java może zostać wygenerowana przez IDE. Jest więcej kodu do odczytania i utrzymania. Przebicie się przez powtarzalny kod i znalezienie ważnych części zajmuje więcej czasu, a więcej czasu na jego zmianę. To w porządku, że Eclipse może konwertować

private Date dateOfBirth;

do:

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

ale za każdym razem, gdy otwieram klasę, widzę te śmieci i muszę prześlizgnąć się obok nich, aby znaleźć interesujące części. Ponadto podczas konserwacji błędy mogą być wprowadzane do generowanego kodu.

Wolałbym raczej zobaczyć:

attr :date_of_birth

Dla mnie potrzeba efektywnego działania IDE w Javie to dobry powód, aby wybrać inny język.

Być może z większą mocą porównaj ten kod Ruby:

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

przeciwko podobnemu kodowi Java:

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

Kod Ruby jest bezpośrednim tłumaczeniem specyfikacji: średnia waga osób powyżej 200 (cm). Komentarz byłby całkowicie zbędny.

Kod Java wymaga znacznej pracy zarówno przy pisaniu, jak i czytaniu.

Paul Graham przedstawia przekonujący argument za zwięzłością języków programowania w tym eseju . Po wykonaniu matematyki na poziomie absolwenta uważam, że jego argumenty są przekonujące, a argumenty przeciwko zwięzłości są słabe. Z pewnością pojedyncza linia w języku wysokiego poziomu może być trudniejsza do zrozumienia niż pojedyncza linia w języku niskiego poziomu, podobnie jak częściowe równanie różniczkowe jest trudniejsze do zrozumienia niż prosty dodatek. Ale łatwiej jest zrozumieć pojedynczą linię w potężnym języku niż pięć lub dziesięć linii, które zastępuje. Wyobraź sobie, że czytasz tekst matematyczny napisany za pomocą słów zamiast symboli.

Kevin Cline
źródło
Nie korzystałem z Pythona, ale użyłem C #, który ma właściwości auto. Ile pracy w Pythonie dodaje do tego logika (np. Odpalenie zdarzenia lub logika sprawdzania poprawności)?
mlk
@mlk - Instrukcja „attr” pochodzi z Ruby. W Ruby bardzo łatwo jest dołączyć zachowanie, gdy właściwość jest ustawiona.
kevin cline
W Pythonie wszystkie atrybuty klas są automatycznie publiczne, więc przez większość czasu będziesz mieć do nich bezpośredni dostęp.
Zhehao Mao,
3
Python nie potrzebuje programów pobierających ani ustawiających - po prostu dateOfBirthupublicznij. Jeśli logika będzie musiała zostać do niej dodana później przy pobieraniu lub ustawianiu, dodaj a _dateOfBirthdo przechowywania danych, a następnie utwórz propertynazwę za dateOfBirthpomocą metod get i set. Kod wywołujący wcale nie musi się zmieniać w Pythonie. Java korzysta tylko z akcesoriów, ponieważ nie ma pojęcia „właściwości”.
Izkata
1
W Javie 8 i strumieniach twój średni kod wagi może być zapisany jako taki:people.stream().filter(p -> p.getHeight() > 200).mapToDouble(Person::getWeight).average().orElse(0);
vitro
7

Kilka lat temu przeniosłem się z Javy do Pythona i osobiście uważam, że jestem bardziej produktywny. Jak zauważa @Joonas, duża część wydajności pochodzi z biblioteki spakowanej. Ale niektóre z nich pochodzą z samego języka. Nie wyobrażam sobie, że nie mam słowników, list ze zrozumieniem, funkcji wyższego rzędu i powłoki.

Pamiętaj, że jeśli znasz już Javę, upłynie trochę czasu, zanim zaczniesz mówić płynnie w języku Python.

Dave
źródło
7

To trochę stare pytanie, ale chciałbym dodać moje 0,03 $. Myślę, że to zależy również od twojego sposobu myślenia. Naprawdę nie znoszę dynamicznych, interpretowanych języków. Z drugiej strony jestem wielkim fanem języków pisanych statycznie. Jasne, używanie Javy może być bardziej szczegółowe, ale łatwiej mi czytać i utrzymywać, kiedy wszystko zostanie powiedziane i zrobione. Uważam, że Python, Ruby i Perl są niezwykle trudne do odczytania (dla mnie). Po prostu nie mogę owinąć głowy, chociaż próbowałem. To powiedziawszy, mogę pisać kod w Scali w porządku i to nic wielkiego. Myślę, że to zależy od tego, z czym czujesz się komfortowo. Pod koniec dnia Java będzie znacznie wydajniejsza; bardziej niż Ruby, Python lub Perl. JVM to fascynująca technologia, a nauka jej wykorzystania może okazać się bardzo korzystna dla Ciebie.

Nodey The Node Guy
źródło
1
Zgadzam się, na pewno możesz naprawdę szybko zhakować Pythona, ale może stać się koszmarem późniejszego debugowania lub dodania nowych funkcji, dlatego często nazywany jest „językiem prototypowania” i właśnie do tego uważam, że jest przydatny (lub do reklamowania skrypty typu hoc)
programmx10
2
kiedy nadejdzie koniec tego dnia? Czekaliśmy około 20 lat, a Java wciąż nie ma pierwszorzędnych funkcji ani żadnego narzędzia do metaprogramowania. W międzyczasie C # osiągnął ogromny postęp. W ciągu ostatniego roku zacząłem pisać kod Groovy zamiast Java, a moja produktywność znacznie wzrosła. Kod Groovy jest znacznie mniejszy i łatwiejszy do zrozumienia niż odpowiedni kod Java, ponieważ szum zniknął.
kevin cline
@Kevin Cline - Wiem, co mówisz - jestem programistą .NET przez ostatnie sześć lat lub coś takiego. Nie mówię tylko o produktywności, ale o zwykłym czasie kompilacji, współbieżności i typach wielordzeniowych. Java i JVM (Groovy, Scala itp.) JVM jest tutaj najważniejszą rzeczą, niekoniecznie sama Java.
Nodey The Node Guy
2
@ programmx10 Konserwowalność kodu w języku Python zależy od sposobu jego napisania. Jeśli stworzyłeś wszystko jednym wielkim kludge, to oczywiście nie będziesz mógł go debugować. Z drugiej strony, jeśli dobrze zorganizowałeś swój kod i podzieliłeś swoją funkcjonalność na moduły i klasy, to może być tak samo łatwe do utrzymania (jeśli nie łatwiej) niż kod Java.
Zhehao Mao,
5

Uważam, że Python, Ruby, JavaScript i SQL są znacznie wydajniejsze niż języki skompilowane, takie jak Java, ponieważ języki te mają bardzo szybką pętlę sprzężenia zwrotnego. Możesz uruchomić kilka wierszy kodu w wierszu poleceń i od razu wiedzieć, czy kod jest poprawny, czy nie. Jeśli rzuca to wyjątki, wiesz natychmiast. W Javie musisz skompilować, spakować i wdrożyć, co często zajmuje kilka minut w przypadku dużych systemów, a to powoduje bardzo powolny cykl opinii.

Szybki cykl sprzężenia zwrotnego pozwala szybko przejść do dobrego rozwiązania, dzięki czemu dynamiczne języki są bardziej produktywne.

Jay Godse
źródło
świetne zastosowanie tego terminufeedback loop
amfibia
3

Ostatnio robiłem znacznie więcej Pythona i od dłuższego czasu jestem programistą Java, a jeśli chodzi o nowy rozwój, myślę, że jestem nieco bardziej produktywny w Pythonie. wiele dość prostych rzeczy w Javie może być nieco żmudnych, takich jak przetwarzanie plików / strumieni, czytanie rzeczy z adresu URL, serializowanie XML itp. przez „nudne”, mam na myśli to, co zabiera ci 5 linii kodu w java weź tylko jeden w python. jednak użycie odpowiednich narzędzi, takich jak guava lub inny interfejs API kolekcji, może naprawdę w tym pomóc.

Myślę, że mówię, że jedną z zalet Pythona jest to, że jest on wyposażony w wiele funkcji, których potrzebujesz, aby użyć biblioteki innej firmy w Javie.

wszystko, co powiedziałem, w przypadku niektórych rzeczy byłbym o wiele bardziej produktywny w Javie niż w Pythonie, szczególnie jeśli chodzi o refaktoryzację i pracę z dużymi bazami kodów itp.

Paul Sanwald
źródło
1
Jednak w Javie chodzi o biblioteki. W Pythonie mają wiele metod, podobnie jak PHP, w których trudno jest zapamiętać je wszystkie. W Javie po prostu szukasz odpowiedniej biblioteki, a potem masz przynajmniej wybór do tego, czego używasz
programmx10
1
@ programmx10 O czym ty mówisz? Python ma wiele bibliotek do wszelkiego rodzaju rzeczy. Wystarczy zajrzeć do dokumentacji standardowej biblioteki. Biblioteki Pythona są podzielone na moduły, podobnie jak biblioteki Java są podzielone na pakiety.
Zhehao Mao,