Python'da programlama C, C ++ veya Java'dan daha mı hızlı? [kapalı]


27

arasında ne kadar dinamik ve gevşek bir şekilde yazdığına, programcının içinde o kadar verimli olacağına dair yaygın bir inanç var. Guido van Rossum, 1998'de python kullanarak verimliliği programlama ve web'de arama yapma üzerine yazdı.

Sözdizimsel olarak Python kodu çalıştırılabilir sözde kod gibi gözüküyor. Python kullanarak program geliştirme, C / C ++ kullanımına göre 5-10 kat, Java kullanımına göre 3-5 kat daha hızlıdır. Çoğu durumda, bir uygulamanın prototipi Python'da herhangi bir C / C ++ / Java kodu yazmadan yazılabilir. Çoğunlukla, prototip yeterince işlevseldir ve son ürün olarak teslim edilmek üzere yeterince iyi bir performans sergileyerek önemli geliştirme zamanları kazanır. Diğer zamanlarda prototip kısmen veya tamamen C ++ veya Java'ya çevrilebilir - Python'un nesne yönelimli doğası çeviriyi basit bir işlem haline getirir.

Bu konu bilimsel olarak doğru bir şekilde değerlendirildi mi? için değilse, o zaman belki , veya gibi kardeş betik dilleri için ?

Sorunu incelemek için zaman harcayan araştırmacılar veya uzmanların görüşleri olmadığı sürece, rasyonalizasyonlar, analojiler veya cevaplamanın potansiyel olarak neden zor olabileceğinin açıklamalarını aramıyorum.

Başlangıçta bu soruyu şüphecilerle sordum.SE , ve birileri de burada sormamı önerdi.


25
Pekala, olası cevaplar kümesini kısıtladığınız için, önce cevaplanması gereken başka bir soruyu sorarak bir yorum yapmaya cüret ediyorum (imho): "Bir programcının verimliliğini" ölçmek için güvenilir ve dengesiz bir ölçüt var mı?
Paul Michalik

1
@Paul Michalik - Verimliliğe bakan herhangi bir araştırma makalesinin bir tanımı olacağını varsayardım (aksi takdirde ölçülmesi gerçekten zor olurdu). Yani eğer birileri araştırmaya başvurduysa, cevabı tanımına dahil etmeleri yararlı olacaktır. Muhtemelen (tahmin ediyorum) üretkenliği ölçmek için kabul edilebilecek birkaç farklı yol var, belki de “en fazla sayıda kişinin geçmesi için gereken zaman” bunlardan biri olabilir.
Kit Sunde

1
@Paul Michalik - Tabi ki kitaplarda, bloglarda, konuşmalarda ve programcıların makalelerinde okuduğunuz ifadelerin kaç tanesi ampirik olarak test edildi? Verimliliği ölçmenin daha iyi veya daha kötü yollarının olduğuna eminim. Örneğin. "Kahve tüketimi / zamanı" muhtemelen klasik "Kod / Zaman Çizgileri" nden bile daha kötü bir zaman olurdu. Bir tanesini gördüğümüz belirli verimlilik iddiaları hakkındaki yargıları geri çeker ve buna dayanarak değerleri tartışabilirim. Verimlilik iddialar ya, ben tedbir emin "kodu / zaman çizgileri" değilim sadece düz yanlış değil şey insanlar metrik yok etmeye çalışıyor değilken.
Kit Sunde

1
Bu makalede ilgilenen olabilir: citeseerx.ist.psu.edu/viewdoc/...
DistantEcho

1
@ChrisF - Bu sorunun programcılar için geçerli olmadığını mı söylüyorsunuz? Kuşkusuz kesinlikle, ve burada da uygun görünüyordu. Robert Cartaino tarafından bu soru üzerine son bir yorumunu okuyana kadar yapmamanız gerektiği izlenimindeydim: skeptics.stackexchange.com/q/1963/631 ki bu, her iki toplumun da ilgisini çekiyorsa, tamamen mükemmel olduğunu söylüyor Sadece bunu başka bir kullanıcı tarafından istendikten sonra yaptım. Sorunun artmakta olduğu göz önüne alındığında, bu topluluğun da ilgisini çekiyor gibi görünüyor.
Kit Sunde

Yanıtlar:


17

Ousterhout'un kodlama dilleri hakkındaki makalesi 1 , programlamanın ne kadar yüksek olursa, programcı ne kadar verimli olursa olsun. Bunu kabul edersek, Boehm 2 dediği gibi , bir programcının belirli bir zamanda yazabileceği satır sayısı sabittir ve dile veya türüne (düşük seviye, sistem programlama, komut dosyası yazma) bağlı değildir, iddiaya kolayca inanılabilir. Elde edilen kaynak-kod-satır-satırı talimatları - kodlama dilleri ile sistem programlama dillerinden daha iyi bir büyüklük sırası (veya birkaç tane) olabilir.

Komut dosyası dilleri, yaygın görevler için (örneğin, veri yapıları, dize manipülasyonu) hazır hazır programlara büyük ölçüde güvendiğinden, temel kullanımları genellikle programları sürdürmek için öğrenmesi kolay ve verimli bir sözdizimi sağlayarak, daha düşük çalışma hızı maliyeti ile üretkenliği artırmaktır. ile. Üst yürütme hızına ihtiyaç duyulduğunda, bir komut dosyası diline başvurulmaz.

[1]: JK Ousterhout, Senaryo: 21. Yüzyılda Yüksek Seviye Programlama , Bilgisayar (IEEE), 1998
[2]: B. Boehm, Yazılım Mühendisliği Ekonomisi , Prentice Hall, 1981


9
Bu iyi bir cevap olsa da, modern senaryo olmayan dillerin de gelişmeyi hızlılaştıran hazır programlarla dolma eğiliminde olduklarını unutmayın. C # akla geliyor. Python'u önceden düşünülmüş herkes C # 'dan daha önceden hazır yardımcı programlarla gelir, Python'u C #' dan daha iyi tanır. Gerçekte her ikisi de geniş ve karşılaştırılabilir bir “yerleşik” yardımcı program yelpazesine sahiptir.
Roman Starkov

@romkyns, önemsiz olmayan herhangi bir proje için çok fazla kod yazmanız gerekir. Bol miktarda Lego tuğlası olsa bile, Bionicles sihirli bir şekilde bir araya gelmiyor.

2
@Thor ama önce bir petrol matkabı, bir plastik fabrikası ve bir lego blok ekstruder inşa etmek yerine, bu Lego tuğlalarını dik tutmaya gerçekten yardımcı oluyor.
Roman Starkov

2
Hem c ++ hem de Java genel kapsayıcılara sahiptir ve c ++ 11, sıralama algoritmaları ve yineleyiciler vb. için tam standart bir kütüphaneye sahiptir. Dahası, bir kişi için programlama zamanımın çoğunu, yazmam gerekenin ne olduğunu çalışmak için harcıyorum. Bu nedenle, bir şeyi yapmak için gereken satır miktarını saymanın, bir programcının bu dilde ne kadar hızlı olacağının açık bir göstergesi olmadığını düşünüyorum.
Sam Redway

7

Verimliliği "belirli bir basit program yazma zamanı" olarak ölçüyorsanız, o zaman programcı deneyimine ve hızlı bir akla, programlayıcıyı değerlendirdiğiniz dilden çok değil, dile göre değişir.

Zamanlamalı kod yarışmalarının dilin bu tür görevler için gerçekten önemli olmadığını gösterdiğine inanıyorum. Bu tür zorlukları diğerlerinden daha kolay kazanan bir dil yoktur (en azından dillerin göreceli popülerliğine izin verirseniz).

Performansı, belirli bir dilde yazılmış "en iyi programın etkinliği" olarak ölçüyorsanız , o zaman daha az dile bağlıdır. Örneğin Galcon AI yarışmasının sonuçlarına bakınız . Kazanan Lisp ile yazılmıştır. Ancak bir sonraki Lisp girişi ise 280. sırada. Bu bize dilin en iyi AI'yı verimli bir şekilde yazmaya uygunluğu hakkında neler söylüyor? Bence hiçbir şey. Bize sadece "bocsimacko" nun geldiğini ve en etkili algoritmaları uyguladığını söylüyor. Kayıt için, zaman bu yarışmada önemli bir faktör değildi - insanların kodlarını geliştirmek için iki aydan fazla süreleri vardı.

Son olarak, performansı “bir projeyi sürdürmenin uzun vadeli maliyeti” olarak ölçtüyseniz, o zaman bir şeyle ilgilendiğinizi düşünüyorum. Özellikle, iş için sadece en iyi insanları işe alırsanız ve dolar yerine erkek-saat olarak maliyeti hesaba katarsanız. Bunun için hangi dillerin en iyisi olduğuna dair güçlü bir fikrim var, ancak sizi bağlayacak sağlam bir kanıtı bulunmuyor. Belki de başka birinin bu tür performans için bağlantıları vardır.


7
“Programcıyı gerçekten değerlendiriyorsunuz, dili değil” - Bu aslında bilimsel olarak yapılmadıysa. 100 programcı al. "Bu özel gereksinimlere sahip bir takvim uygulaması yaz" gibi genel bir proje seçin. Otomatik birim testine bağlı olan gereksinimler. 50 programcı uygulamayı C ++, 50'de Python'da rastgele seçerek yazar, böylece kalite geliştiriciler eşit şekilde dağıtılır. Sonuçlar, ortalama tamamlanma süresini geçen birim test sayısı ile birleştiren bir puan olacaktır. Python sonuçlarının ortalamasını C ++ sonucunun ortalaması ile karşılaştırın ve ... SCIENCE!
Morgan Herlocker,

2
@Prof Belki her birinden bin tane alırsanız ... ama yine de, sadece belirli bir zihniyete ve belirli bir yetenek düzeyine sahip insanların C ++ 'ı bilmesi gerçeğini nasıl kontrol edersiniz?
Roman Starkov

Örneğinizi yalnızca C ++ ve Python'da bir yeterlilik sınavını geçebilecek olan kişilerden alabilirsiniz. Eski profesörlerin çoğu benzer çalışmalar yapıyorlardı. Ayrıca, burada başkalarının burada tartıştıkları birkaç varsayımda bulunuyorsunuz: programmers.stackexchange.com/q/73715/3792
Morgan Herlocker

6

http://page.mi.fu-berlin.de/prechelt/Biblio/jccpprtTR.pdf , farkında olduğum birkaç çalışmadan biriyken , çeşitli dillerde verimlilik arasında gerçek bir doğrudan karşılaştırma yaptı. Eski, ama konuyu ilginç bulursanız okumaya değer. Karşılaştırmada, makalenin çok dürüst olduğu çok sayıda önemli eksiklik var.

Genel sonuç, düşük seviyeli dillerin (örneğin C, C ++) yazması daha uzun sürdüğü, daha az bellek alabileceği ve çok daha hızlı çalışabileceğidir. Fakat çok yüksek değişkenliğe sahip. Yüksek seviyeli komut dosyası dilleri yazma işleminin yarısını alır ve yaklaşımda daha az değişkenlik gösterir. Başlangıçta şaşırtıcı bir dereceye kadar, kodlama dilinde bir şey yapmanın açık bir yolu olma eğilimindedir.

Java için tüm performans numaralarının büyük miktarda tuzla alınması gerektiğini unutmayın; bu kişiler 90'lı yıllarda, insanlar Java ile ilgili çok fazla deneyime sahip olmadan önce ve JVM'nin iyi bir şekilde optimize edilmesinden önce üretildi. Her iki faktör de önemli etkiye sahip olmalıdır.


1

Genel olarak koymak gerekirse, Python'da bir program yazmak genellikle aynı programı C, C ++, Java'da yazmaktan daha hızlı olacaktır.

Daha yavaş çalışması da olasıdır.

Elbette, bazı görevlerin “daha ​​doğal” bir şekilde desteklendiğinden, diğer dillerin daha hızlı olabileceği belirli uygulamalar vardır.

Hız / üretkenlikteki bu artışı doğrulayacak herhangi bir çalışmadan habersiz olmamakla birlikte (bir yorumcunun söylediği gibi, bunu kesin olarak ölçmek zor olabilir), dilin ifadesi üzerine doğrudan araştırmalar yapıldı.

Dil ifadesi ile programlama hızı arasında bir bağıntı olduğunu düşünüyorum. Sadece basit bir yineleme kalıbını ve bir Pythonic for-loop veya list kavrayışının nasıl daha özlü olabileceğini hayal edin. Sadece hemen daha hızlı bir şekilde yazılmakla kalmaz, aynı zamanda tek tek hataların, sınırların dışında endekslerin ve kodlama işlemini önemli ölçüde yavaşlatabilecek diğer sorunların endişelerini de ortadan kaldırır.

Bu, dillerin ifade oranları için bir tahmin tablosunu göstermektedir. Bir tane tuzla birlikte alınması gerekirken, bahsettiği dipnotlar çok faydalı.

http://en.wikipedia.org/wiki/Comparison_of_programming_languages#Expressiveness


-5

En son Java kullandığımda (bir süre önce kuşkusuz) bir dosyayı açmak ve yazmak için kod dolu bir ekran aldı. Bunu Python veya Perl'deki birkaç satırla karşılaştırın; hangisinin daha hızlı olduğunu tahmin edebilirsiniz.

Açıkçası, dillerin hepsinin kendi güçlü ve zayıf yönleri vardır, ancak çoğu görev için Python yazmak daha hızlı olacaktır.


6
"Açmak ve bir dosyaya yazmak için kod dolu bir ekran aldı": Bunu iki yöntemle bir yardımcı sınıfına koyun write()ve read()Java projenizin geri kalan kısmında Python'da olduğu gibi özlü olacaktır. Bence örnek, Python ve Java'yı karşılaştırmak için çok sınırlı.
Giorgio

Elbette, ancak Python, Perl ve daha yüksek diller genellikle bu şeyleri önceden düşünmüşlerdi ve bu yüzden faydalı sınıfları (veya çoğunu değil) yazmak zorunda değilsiniz. Yardımcı sınıf kullanmak hala zaman alır ve gerçekte ne yaptığınıza bağlı olarak hem Java hem de Python için geçerli olan yeniden kullanılabilir kod ilkesidir.
wobbily_col 20:13

Bu, Java'nın yalnızca bir dosyayı açmak ve yazmak için 50 - 60 kod satırına ihtiyacı olduğunu varsayar. Bu sadece doğru değil.
h22
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.