Python verimlilik VS Java Verimliliği


24

SO üzerinden, Google AppEngine'de hangi platform, Java veya Python'un geliştirilmesinde en iyi olduğu ile ilgili bir soru ile karşılaştım. Birçok kişi, Python'u Java üzerinden kullanmaktan elde edilen verim artışıyla övünüyordu. Python'a karşı Java üretkenliği argümanı hakkında söyleyeceğim bir şey, Java'nın dinamik doğası nedeniyle Python'un gerçekten bu alanda eksik olduğu gelişmeyi hızlandırmak için mükemmel IDE'lere sahip olmasıdır.

Bu yüzden Python'u bir dil olarak kullanmayı tercih etsem de, özellikle yeni bir çerçeve kullanırken Java ile karşılaştırıldığında verimlilik artışı sağladığına inanmıyorum. Açıkçası, Java ve Python olsaydı ve kullanabileceğiniz tek editör VIM ise, Python size büyük bir verimlilik artışı sağlayacaktı ancak IDE'ler denkleme getirildiğinde kesin bir kesinti değil.

Bence Java'nın yararları genellikle sadece bir dil düzeyinde ve çoğu zaman da eski varsayımlarda değerlendirilir ancak Java, dilin kendisinin dışında birçok faydaya sahiptir; parti kütüphaneleri, platformlar vb.

Soru, Python / ilgili dinamik diller gerçekten bahsettiğimiz büyük verimlilik artışlarını sağlıyor mu? (yeni çerçevelerin kullanılması ve orta ila büyük uygulamalarla çalışılması dikkate alınarak).


2
PyCharm IDE'ye göz atın. Ancak, GAE için Java kodunu ön uçta kullanmak için JavaScript'e dönüştüren ve bu da büyük bir verimlilik kazancı olabilecek yeni bir çerçeve olduğuna inanıyorum.
Andrew M,

14
IDE olsun ya da olmasın, Python'un bir satırında yapılabilecek bazı şeyler için 10 satır Java yazmanız gerekir.

2
Java'ya olan sevginizden utanmayın. İzmaritleri atmana izin veren birkaç numara (IDE, kütüphaneler ve çerçeveler) öğrendin. Kucakla. Müthiş olmak için bizden izin almanıza gerek yok. Java sizi üretken yaparsa , bu yeterli.
Roger

1
1) JVM potansiyeli çok sınırlıdır . Kasıtlı. "Kötü" değil, sadece, iyi, sınırlayıcı. 2) IDE'ler, yalnızca yaptığınız tek şey mevcut yüzlerce bileşenin (geçerli ve onurlandırılmış bir programlama türüdür, sadece bir tane değil) birleştirilmesi durumunda yardımcı olabilir. Kompleks algoritmalar uygulamaya gelince, Python Java'dan çok daha üretkendir (lambda fonksiyonları ve liste anlama gibi şeyler bile büyük bir fark yaratır).
SK-mantık

1
Verimliliğiniz IDE'niz tarafından önemli ölçüde artarsa, şansınız sizin veya programlama platformunuzun çok yanlış bir şey olması. (Smalltalk bunun istisnasıdır, çünkü programlama için tamamen yansıtıcı bir sistem oluşturur).
Marcin

Yanıtlar:


18

Python'un en büyük avantajlarından biri “piller dahil” felsefesidir: standart bir kütüphane kullanmak için kapsamlı ve basit. Java'da, sadece bir metin dosyasını okumak, birkaç satır kod, iç içe okuyucular ve benzerlerini gerektirir. Python'da öyle f.read(). Bu, özellikle hızlı prototip yapımında kesinlikle büyük bir verimlilik artışı olacaktır. Python dili de genellikle daha az ayrıntılıdır, ki bu kötü bir şey değildir (her ne kadar ayrıntıların ve özlülüklerin öneminin çoğunlukla vurgulandığını düşünüyorum).

Ancak, zaten GAE gibi bir çerçeve üzerinde çalışıyorsanız, farklılıkların çok daha küçük olmasını ve çoğunlukla dilin kişisel akıcılığına kadar olmasını beklerdim. Genellikle çerçeveyi seçtiğiniz sözdizimiyle birlikte kablolayacaksınız ve Python'un mükemmel standart kütüphanesi çok az yardımcı oluyor.


Ben gerçekten Gae kullanmayı öğrenmek gerekir. Tavsiye edebileceğiniz herhangi bir çevrimiçi eğitim serisi var mı? Ben tanıdık Python ile ancak GAE hakkında bir ipucu yok. Teşekkürler!


4
Veya Apache Commons IO'yu Maven config satırıyla ekleyebilir ve ardından dosyaları tek satırda okuyabilirsiniz. Piller dahil yaklaşım bana iki ucu keskin bir kılıç.
Jiggy

jiggy: Bir dereceye kadar katılıyorum; Python'un pilleri neredeyse her zaman faydalıdır ve çoğu zaman yeterlidir, ancak standart kütüphane olası tüm amaçlara hitap edemez, bu nedenle bazen kütüphanelere geri dönmeniz gerekir.
Joonas Pulakka

2
Java bir metin dosyasını okuma: List<String> lines = Files.readAllLines(Paths.get("file.txt"), Charset.forName("UTF-8"));. Fena değil! (Bu, henüz 11 Mart'ta serbest bırakılmayan Java 7'dir).
assylias

19

İşte benim 2 kuruş. Tecrübelerime göre Python küçük ve orta ölçekli projeler için iyidir, oysa daha büyük projeler için Java ile daha üretkenim.

Genel olarak, daha küçük projeler için Python (veya PHP) gibi dinamik olarak yazılmış bir dil kullanabilirim: çok karmaşık değil, hızlı bir şekilde halletmek istiyorsunuz ve yanlış gidebilecek çok fazla bir şey yok. Bu durumda, Python'un kullanımı daha pratik olabileceğini düşünüyorum.

Ancak, daha büyük bir yazılım geliştirmem gerektiğinde, Java gibi statik olarak yazılmış bir dili tercih ediyorum çünkü derleyicinin benim için olabildiğince çok kontrol yapmasını tercih ediyorum. Tecrübelerim, daha büyük projelerde Python ile hataları düzeltmek için Java'dan daha fazla zaman harcamak zorunda kalmam, bu yüzden Java'da kod yazmak biraz daha fazla zaman alırsa, ben daha fazla zaman harcayacağımı zahmet etmem.


6
+1, tamamen katılıyorum. Python ve benzer dilleri kullanarak, başımın tüm çevresine çok fazla sorun çıkarmadan sarılabileceğim daha küçük projelerde kullanmayı seviyorum. Sorun, bileşenler arasında ara yüzler çıkarmanız gereken daha büyük projelerde ortaya çıkıyor. Bu, zayıf refactoring desteğiyle birleştiğinde, büyük, istikrarlı ve sürdürülebilir sistemler üretmem konusunda beni daha az güvende tutar. Derleyicinin gerçekleştirdiği statik analiz eksikliğini telafi etmek için birçok testin yazılması ve sürdürülmesi gerekir. Bu noktaya geldiğinde, hızlı ilk yinelemenin yararı bakımdan kaybolur.
bunglestink

İkisini de kullanıyorum ve ikisini de seviyorum. Sana tamamen katılıyorum.
Daniel Baktiar

11

Python veya Ruby gibi daha güçlü dillerde çok daha üretkenim. Java kodlarından bazılarının bir IDE tarafından üretilip üretilemeyeceği önemli değildir. Okumak ve sürdürmek için daha fazla kod var. Tekrarlayan kodları gözden geçirip önemli parçaları bulmak ve değiştirmek için daha fazla zaman alır. Eclipse'in dönüştürebilmesi sorun değil

private Date dateOfBirth;

için:

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

ama sınıfı her açtığımda, bu çöpleri göreceğim ve ilginç parçaları bulmak için geçmişe bakmak zorunda kalacağım. Ayrıca, bakım sırasında, üretilen koda hatalar eklenebilir.

Çok görmeyi tercih ederim:

attr :date_of_birth

Bana göre, bir IDE'nin Java ile etkili bir şekilde çalışması ihtiyacı, başka bir dil seçmek için iyi bir neden.

Belki daha güçlü bir şekilde, bu Ruby kodunu karşılaştırın:

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

benzer Java koduna karşı:

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

Ruby kodu şartnamenin doğrudan bir çevirisidir: 200 (cm) 'den daha uzun olan insanların ortalama ağırlığı. Bir yorum tamamen gereksiz olacaktır.

Java kodu hem yazmak hem de okumak için önemli miktarda çalışma gerektirir.

Paul Graham bu yazıda programlama dillerinde kısalık için ikna edici bir argüman yapar . Bazı yüksek lisans düzeyinde matematik yaptıktan sonra, onun argümanını çekici buluyorum ve kısalık karşıtı argümanları zayıf buluyorum. Elbette, yüksek düzeyde bir dilde tek bir satırın düşük seviyeli bir dilde tek bir satırdan daha zor anlaşılması zor olabilir; tıpkı kısmi bir diferansiyel denklemin basit bir eklemeden daha zor anlaşılması gibi. Ancak, güçlü bir dilde tek bir satırın yerini anlamak beş ya da on satırdan daha kolaydır. Semboller yerine kelimeler kullanılarak yazılmış bir matematik metnini okuduğunuzu düşünün.


Python'u kullanmamıştım ama otomatik özellikleri olan C # kullandım. Python'da buna mantık eklemek ne kadar çalışır (bir olayı ateşlemek veya doğrulama mantığını söylemek)?
mlk

@mlk - "attr" ifadesi Ruby'dendir. Ruby'de bir özellik ayarlandığında davranış eklemek çok basittir.
kevin cline

Python'da, tüm sınıf özellikleri otomatik olarak herkese açıktır, bu nedenle çoğu zaman onlara doğrudan erişeceksiniz.
Zhehao Mao

3
Python'un alıcılara veya ayarlayıcılara ihtiyacı yoktur - sadece dateOfBirthherkese açık olun. Mantık işleminin daha sonra set veya set üzerine eklenmesi gerekiyorsa _dateOfBirth, verileri saklamak için bir a ekleyin , sonra hem get hem set yöntemleriyle bir propertyad oluşturun dateOfBirth. Çağıran kodun Python'da hiç değişmesi gerekmez. Java sadece erişimciler kullanır çünkü "özellik" ler kavramına sahip değildir.
Izkata

1
Java 8 ve akışları ile ortalama ağırlık kodunuz şöyle yazılabilir:people.stream().filter(p -> p.getHeight() > 200).mapToDouble(Person::getWeight).average().orElse(0);
vitro

7

Java'dan Python'a birkaç yıl önce taşındım ve şahsen daha üretken olduğumu hissediyorum. @Joonas'ın işaret ettiği gibi, üretkenliklerin çoğu paketlenmiş kütüphaneden geliyor. Fakat bazıları dilin kendisinden. Sözlüklere sahip olmamayı, anlamalarını, liste fonksiyonlarını ve bir kabuğu olmadığını hayal edemiyorum.

Java'yı zaten biliyorsanız, Python'da akıcı olmak için biraz zaman alacağınızı unutmayın.


7

Bu biraz eski bir soru ama benim 0,00 $ eklemek istiyorum. Bence senin de düşündüğün gibi. Ben biri için gerçekten dinamik ve yorumlanmış dillere dayanamıyorum. Öte yandan, statik olarak yazılmış dillerin büyük bir hayranıyım. Tabii, Java kullanmak daha ayrıntılı olabilir, ancak hepsi söylendikten ve yapıldıktan sonra okumayı ve sürdürmeyi daha kolay buluyorum. Python, Ruby ve Perl'i okumayı çok zor buluyorum (benim için). Denememe rağmen kafamı dolamıyorum. Bununla birlikte, Scala'da kod yazabiliyorum ve sorun değil. Bence neyin rahat edeceğine bağlı. Günün sonunda Java çok daha güçlü olacak; Ruby, Python veya Perl'den daha fazlası. JVM, sizin için çok faydalı olabileceğini kanıtlayan güçlü bir teknoloji ve gücünden faydalanmayı öğreniyor.


1
Anlaşılan, Python ile gerçekten hızlı bir şekilde kesebileceğinize emin olabilirsiniz, ancak daha sonra hata ayıklamak veya yeni özellikler eklemek kabus olabilir, bu yüzden sık sık "prototip dili" olarak adlandırılır ve bunun için (ya da hoc betik türü)
programmx10

2
o günün sonu ne zaman gelecek Yaklaşık 20 yıldır bekliyoruz ve Java hala birinci sınıf işlevlere ya da herhangi bir meta-programlama özelliğine sahip değil. Bu arada C # müthiş bir şekilde gelişti. Geçen yıl boyunca Java yerine Groovy kodu yazmaya başladım ve verimliliğim çok arttı. Groovy kodunu, ilgili Java kodundan daha küçük ve anlaşılması kolaydır, çünkü gürültü gider.
kevin cline

@Kevin Cline - Ne dediğini biliyorum - Son altı senedir bir .NET geliştiricisi oldum. Ben sadece üretkenlikten söz etmiyorum, derleme zamanı, eşzamanlılık ve çok çekirdekli türden şeyler. Java ve JVM (Groovy, Scala, vb.) JVM, burada mutlaka Java'nın kendisi olması gerekmeyen en önemli şeydir.
Nodey Düğüm Guy

2
@ programmx10 Python kodunuzun bakımı, nasıl yazdığınıza bağlıdır. Hepsini büyük bir çamur haline getirdiyseniz, elbette ki onu ayıklayamazsınız. Öte yandan, kodunuzu iyi organize ettiyseniz ve işlevselliğinizi modüllere ve sınıflara ayırdıysanız, bakımı Java kodundan daha kolay (eğer kolay değilse) olabilir.
Zhehao Mao

5

Python, Ruby, Javascript ve SQL'in Java gibi derlenmiş dillerden çok daha üretken olduğunu düşünüyorum çünkü bu dillerin çok hızlı bir geri bildirim döngüsü var. Bir komut satırında birkaç kod satırı çalıştırabilir ve kodun doğru olup olmadığını hemen anlayabilirsiniz. İstisnalar atarsa, hemen anlarsın. Java ile, büyük sistemler için genellikle birkaç dakika sürebilen, derlemeniz, paketlemeniz ve dağıtmanız gerekir; bu, çok yavaş bir geri besleme döngüsüyle sonuçlanır.

Hızlı geri bildirim döngüsü, hızlı bir şekilde iyi bir çözüme ulaşmanıza olanak tanır ve dinamik dilleri daha verimli yapan da budur.


terimin büyük bir uygulamafeedback loop
amfi

3

Son zamanlarda çok daha fazla python yapıyorum ve uzun zamandır bir java programcısıyım ve yepyeni bir gelişme için, pitonda biraz daha üretken olduğumu düşünüyorum. Java'da oldukça basit bir çok şey, biraz sıkıcı olabilir, dosya / akış işleme, URL'den okuma, XML serileştirme, vb. gibi "sıkıcı" gibi. python sadece bir tane al. guava veya başka bir koleksiyon API'si gibi doğru araçları kullanmak, buna gerçekten yardımcı olabilir.

Sanırım pitonun bir avantajı, java’da bir 3. parti kütüphanesini kullanmanız için gereken birçok özelliğe sahip olması.

tüm söylenenler, bazı şeyler için java'da python'da olabileceğimden çok daha verimli olacağım, özellikle büyük kod tabanlarıyla yeniden düzenleme ve çalışma söz konusu olduğunda, vb.


1
Java tamamen kütüphanelerle ilgilidir, Python ile PHP gibi, bir sürü yöntemi vardır, hepsini hatırlamak zor olabilir, Java ile sadece uygun kütüphaneyi ararsınız ve sonra en azından ne kullandığınıza
programmx10

1
@ programmx10 Ne hakkında konuşuyorsun? Python'un her türlü şey için birçok kütüphanesi vardır. Standart kütüphane dokümanlarına bakın. Python kütüphaneleri, Java kütüphaneleri paketlere ayrıldığı gibi modüllere ayrılmıştır.
Zhehao Mao
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.