Algoritmik Programlama için Python'u C yerine tercih etme


16

Ben algoritmalar biraz çalışıyorum ve SPOJ.pl TopCoder vb gibi sitelere bakıyordum Programcılar genellikle çoğu algoritmik programlama yarışmaları için C veya C ++ tercih gördük.

Son zamanlarda biraz sorun yaşıyorum. C ve Python biraz biliyorum ve bir kod yazmaya çalışırken ben çoğu algoritma için C üzerinde Python tercih gibi görünüyor. Her zaman yaklaşık 15 dakika sonra vazgeçmek CI bir kod yazmak için oturmak çünkü çok hantal bulmak ve python için hareket eğilimindedir. Matrisleri Geçmek İşaretçiler ve benzerlerinin aslında algoritmanın kendisi hakkında düşünmek için kullanabileceğim gereksiz zaman kaybı gibi görünüyor.

Şimdi biliyorum ve birçok insandan C'nin çok önemli bir dil olduğunu ve bir çok programcının ekmek ve tereyağı olduğunu duydum.

Bilmek istediğim, bu yaklaşımın herhangi bir dezavantajı / sonucu / dezavantajı vb.

Bu bir Python vs C tartışması değildir; Bu, kullanım kolaylığı nedeniyle C'ye karşı python'u tercih etmenin bu özel uygulamasının beni veya uzun vadede herhangi bir programcı / bilgisayar bilim insanını nasıl etkileyeceği hakkında bir soru.


Bu dilleri sektörde kullanan / veya büyük yazılım / kütüphaneler vb. Geliştiren insanlardan duymak isterim.


bu konu bu tartışmaya bağlantı olmadan tamamlanmayacak lukeplant.me.uk/blog/posts/…
permeakra

11
@permeakra: Bu sadece bir rant, temelde Haskell ve Python'u öğrenmenin sizi diğer dillerde daha iyi hale getirmediğini belirterek, bu diğer diller berbat.
Robert Harvey

Bu sadece bir rant değil, çünkü Python ve Haskell'in kullanıcılarının zihnini nasıl etkilediğini ve bu konudaki diğer insanların birçok yorumunu içeriyor. Bununla birlikte, c'yi karşılaştırma olarak düşük düzeyli dil olarak kullanmaz, ancak biraz daha yüksek düzeyli bir dil kullanır, ancak fikir aynıdır - biri şu anda çalışmakta olduğu dile başka bir dilden fikirler getirmeye başlar ve kodu deyimsel olmayan hale getirir . İyi bir şey olabilir, ama ...
permeakra


Bu şey ne olursa olsun, biraz algoritmik olmayan bir programlama görmek ilginç olurdu .
SK-logic

Yanıtlar:


14

Deneyimlerime göre, insanlar C'de kodlama algoritmaları aşırı zorluk çektiğinde, bunun nedeni genellikle uygun soyutlamalar oluşturmak yerine veri yapısı yönetimini algoritmalarıyla sıkı bir şekilde bağlamalarıdır. Örneğin, yapım push()ve pop()işlevler yerine her yerde bağlantılı liste işaretleyicilerini elle işlemek . Bu soyutlamaların kendilerine verilmesine alışkınlar.

Bu sorun, daha düşük seviyeli soyutlamalarda çok daha belirgin olmakla birlikte, sıkı kuplajı tanımamak ve uygun soyutlamalar yaratmamak her düzeyde bir sorundur. Temiz ve okunabilir görünen bir algoritma yapana kadar C'de bu becerileri uygulamak kullandığınız her dile aktarılır.

Python programcıları arasında ara sıra gördüğüm diğer sorun, ölçekte performansa uyum sağlamada zorluk. Performans genellikle birincil sorun değildir, ancak nispeten küçük bir veri yapısı için bir algoritma uygulamanın en pythonic yolu, gigabayt veya daha fazla veriyle çalışırken sisteminizi durdurabilir. İyi bir C programcısı olmak, herhangi bir dilde bu tür sorunlardan daha fazla haberdar olmanıza yardımcı olur.

Bu becerileri diğer dillerde öğrenebilir misiniz? Tabii, ama C yanlış yaptığınızda çok daha açık hale getirerek yardımcı olur.

Bununla birlikte, bir seçeneğim olduğunda algoritmik programlama için python kullanıyorum, ancak C kadar rahat olmama rağmen. Python, bu tür bir programlama için çok güzel yapan dil özelliklerine sahip ve performans farklılıkları genellikle ihmal edilebilir. Her ikisini de bilen diğer programcıların neden C'yi seçeceğini söyleyemem. Birçoğunun kendilerini kalabalıktan ayırmak için yaptığını hayal ediyorum.


1
"Bu soyutlamaların kendilerine verilmesine alışkınlar." Bu, C'den önce python öğrendiğimi ve bu nedenle bu çizgilere uyum sağlayamadığını veya bir şey yapamayacağımı varsayıyor mu?
13'te

10

Birincil ilgisi programlama olmayan araştırmacılar, Python gibi daha üst düzey dilleri tercih ederler, çünkü bir çözümü C gibi dillerde daha kolay kodlayabilirler. Python, buna daha "prototip" odaklı olduğundan, "piller dahildir" ve NumPy ve SciPy gibi sayısal kitaplıklarla bütünleşir.

Bir araştırmacının daha iyi performansa ihtiyacı varsa, genellikle Python'da oluşturdukları algoritmayı, onu optimize etmenin yollarını bulan (C'ye kadar kodlama ve kodlamayı da içeren) bir Yazılım Mühendisine devredeceklerdir.


Yani temelde araştırmacılar ve Yazılım Mühendisleri bir tasarımcı El Sanatları-adam ilişkisi var mı? Her iki insanın da endüstride kullanımı ne olacak?
ffledgling

9
Bence paket, Python'da bir algoritmanın kodlanmasının ve sonra C'de daha rafine bir uygulamanın yazılmasının mükemmel kabul edilebilir bir senaryo olduğunu düşünüyorum.
Robert Harvey

veya "Cython'da kayıt"?
endolit

10

Unutmayın SPOJ.pl, ACM yarışması ve tüm benzer yarışmalar, yarışmadan hemen sonra atılacak olan çalışma kodunu hızlı bir şekilde üretmeye odaklanmıştır. TopCoder bunu yapar, ancak daha küçük bir ölçüde (kod, OO-tasarım düzeyinde en azından uygun şekilde düzenlenmiştir).

Ancak, gerçek programlama dünyasında algoritmik programlama yarışmalarında alacağınız hemen hemen her kısayol bir anti-kalıptır. Sadece bunu göz önünde bulundurursanız, herhangi bir karşılaştırma yapabilirsiniz. Örneğinizi ele alalım: farklı işlevler arasında çok boyutlu bir dizi geçirme. Bir yarışma ortamında, en iyi yaklaşım, uygun arama ayrıntılarını (örneğin boyutu geçmeli miyim yoksa belirlenebilir mi?) Belirleyerek zamandan tasarruf etmek için küresel diziyi bildirmek olacaktır. Gerçek hayattaki programlamada bunun tam tersini yapardım.

Yani, sorunuza göre, algoritmalar için C üzerinden Python seçmenin herhangi bir karmaşık sonucu var mı, hayır diyorum. Sadece algoritmayla ilgileniyorsanız, Python ve C'de de aynı şeyi yapacaksınız. Fonksiyonel bir dilde uygulanması bazı farklılıklar getirebilir, ancak algoritma hala aynıdır.

C'de algoritmayı uygulayarak elde ettiğiniz tek şey, yürütme üzerinde daha fazla kontrol ve sadece daha düşük seviye soyutlamaları kullandığınızın garantisidir. Bu küçük bir şey değil, çünkü Python'da karmaşıklığın çoğu gizlidir. Ancak, sorun üst düzey soyutlamalarda önemsiz değilse, sadece yürütme hızını kaybetmişsinizdir ve çoğu durumda programı gerçekten olabildiğince hızlı yapmaya çalışmıyorsunuz, sadece öğreniyorsunuz .

Daha önce önerildiği gibi, Python çok yavaş çıkıyorsa, bir Python uygulamasını her zaman bir C uygulamasıyla değiştirebilirsiniz. Ancak bu büyük bir projede muhtemelen 2-3 kez olacak, bu nedenle C'de başlamak sizin tercih ettiğiniz dil değilse (ve bunu belirtmediniz) zaman kaybı olabilir.


1
Herhangi bir yorumlanmış dilde büyük performans artışı nedeniyle gerçek bir matematik yoğun uygulama yazıyor olsaydı neredeyse kesinlikle C veya C ++ seçecektir ('C / C ++' diye bir şey yoktur). Birkaç yıl önce Topcoder'a baktım ve yarışmalar sızıntılar gibi küçük ayrıntıları umursamadığı için hafızayı kaçak yapan çok fazla C ++ gördüğümü hatırlıyorum. Etkilendim değildi.
Jim In Texas

Kesinlikle benim açımdan. Bu bir öncelikler sorusu: üst kodlayıcılar bellek sızıntılarını umursamıyorlar, çünkü çekirdek zaten onlardan sonra temizleyecek; zaman kazanırlarsa kötü uygulamaları veya anti-kalıpları umursamazlar.
K.Steff

2
Son paragrafınız altın kuralı içeriyor: "çalışmasını sağlayın , sonra hızlı yapın".
Carson63000

9

Uzun süredir TopCoder üyesi ve ara sıra SPOJ kullanıcısı olarak, C / C ++ 'ı yarışmalarda diğer dillere tercih etmenin önemli bir nedeninin ham hızı olduğunu söyleyebilirim. Program yürütmeniz zamanlandığında, alabileceğiniz "en hızlı" dili seçmek için muazzam bir baskı vardır, çünkü size algoritmanızı kodlama açısından daha gevşek olur. TC'deki ilerlemem Java'dan C # 'a C ++' ya gitti.

Bununla birlikte, bu durum yarışmalarda günlük gelişimden daha yaygındır: optimal kod yazmanın evrensel olarak önemli olmasına rağmen, kodunuzu mümkün olan en kısa sürede bitirmenin ve mümkün olduğunca sürdürülebilir hale getirmenin göreceli önemi genellikle birkaç tasarruf sağlar yüz CPU çevrimi. Python'da bir şeyi kodlamakta daha rahatsanız, genellikle tercih edilen bir çözümdür.

Dahası, Python C ++ 'da bulunmayan yüksek seviyeli yetenekler sunar. Bunları oluşturmak genellikle çok pahalıdır ve hatta bazen imkansızdır (örneğin, C ++ 'da yansıma oluşturmayı veya kendi kendini değiştiren kodu düşünün). Bu gibi durumlarda, daha üst düzey bir dile güvenmek de en uygun çözüm olabilir.


TC ve SPOJ kullanıcısı olduğunuz için. Kod için python kullanırsak zaman ve basitlik arasındaki ticaret çok büyük mü? Yani aynı algoritma C kullanılarak başarılı bir şekilde gönderilebiliyorsa python kullanarak başarılı başvurular yapmak mümkün müdür? (Evet, büyük ölçüde soruya soru soracağını / değişebileceğini biliyorum, ancak çoğu durumda veya sadece bazılarında bir avantaj var mı?)
ffledgling

@Ayos Python için konuşamıyorum çünkü TC veya SPOJ bağlamında hiç kullanmadım, ancak C ++ 'ın C # ve Java'ya göre avantajı sadece zaman zaman önemlidir ve o zaman bile aşırı derecede önemli değildir. C ++ 'dan C #' a kodlanmış bir algoritmanın basit bir portu bir zaman aşımı ile başarısız olduğunda, ancak bir uygulama odasındayken sadece bir vakayı hatırlayabilirim. Çoğu zaman, doğru algoritmayı bulmak başarılı ve başarısız gönderimler arasında fark yaratan tek şeydir.
dasblinkenlight

1
Python, Ruby ve Perl gibi yorumlanmış dillerin, Java ve C # gibi derlenmiş üst düzey dillerden (C ile karşılaştırıldığında yavaş olan) birkaç kat daha yavaş çalıştığını unutmayın. Nihayetinde, olağanüstü büyük veri kümeleriyle çalışmayı planlamadığınız veya gerçek zamanlı hıza ihtiyaç duymadığınız sürece gerçekten önemli değildir.
KChaloux

5

Her zaman yaklaşık 15 dakika sonra vazgeçmek CI bir kod yazmak için oturmak çünkü çok hantal bulmak ve python için hareket eğilimindedir.

Bu verimlilik kazancı, C ve C ++ işlerinin önemli ölçüde azalmasının yaygın nedenidir.

Bu, kullanım kolaylığı nedeniyle C'ye karşı python'u tercih etmenin bu özel uygulamasının beni veya uzun vadede herhangi bir programcı / bilgisayar bilim insanını nasıl etkileyeceği hakkında bir soru.

Bunun iki temel parçası var. Birincisi algoritmik programlama. Algoritmayı ifade etmek için hangi dili kullandığınız gerçekten önemli değil. Algoritmanın kendisi ile çalışmak ve doğru olanları doğru sorunlara uydurmak kilit parçalardır, bu yüzden orada gerçek bir sorun yoktur.

İkinci bölüm verimlilik kazanımlarıdır. Zaman içinde sizi daha üretken kılan şeyleri kullanmak iyi bir alışkanlıktır ve kariyeriniz boyunca size fayda sağlayacak başka bir şey yapmaz. Algoritmaları farklı dillerde ifade edebilmek çok yararlıdır, ancak bu yardımseverlik, dillerin hangi deyimleri kullandıkları hakkında daha fazla şey ifade eder.

Kısacası, endişelenme . Algoritmayı ifade etmek için kullandığınız şey, onu ifade etmekten çok daha az önemlidir.


3
"C ve C ++ işleri önemli ölçüde azaldı". Ha? Tersi eğilimi gördüğüm için bu maviden çıkarılmış gibi görünüyor. -1, bu ifade için bir kaynak belirleyene kadar.

3

Python veya Ruby gibi daha yüksek seviyeli dilleri kullanmanın avantajları (1) sözdizimlerinin sahte kodlara çok yakın olması ve (2) standart kütüphanelerinin kutudan çıkar çıkmaz yararlı veri yapıları sağlamasıdır (piller @Robert'in bahsettiği konsept dahil). Bu yüzden onları kullanmayı tercih etmek gayet iyi. Sadece ana akım veya "havalı" olduğu için bir dil seçmek yerine verimliliğinizi en üst düzeye çıkaran her şeyi kullanın.


Bir hippi misin? İşte PBR'niz. Ben mi? Havalı olmayı tercih ederim.
Thomas Eding

2

C / C ++ 'dan daha yüksek seviyeli dillerde programlama yaparken kaçırdığınız şey bilgisayarların nasıl çalıştığını öğrenmektir. Gömülü sistemler, işletim sistemleri ve donanım sürücüleri gibi şeyler geliştiremezsiniz. C bilmek aynı zamanda montajcı öğrenirken de yardımcı olur.

Ayrıca, tüm kritik görev sistemlerinin büyük çoğunluğu hala C'de geliştirilmektedir, bu yüzden bilmeden birkaç yazılım yazılımı dalında (havacılık / otomotiv / med-tech vb.) Çalışamayabilirsiniz.


Soru, metale yakın yönlerle değil, algoritmalarla ilgili idi.
Konrad Rudolph

@KonradRudolph Tamam, ama donanım sürücüleri yazmak çoğunlukla algoritmalarla çok yakından ilgilidir. Örneğin, analogdan dijitale dönüştürücü için bir sürücü yazarken, dijital filtreler ve belki de bir tür kuyruk veya öncelik sistemi geliştirmeniz gerekecektir. Ve sonra sürücünüzün üstünde bir API. Bir "nesne" veya "soyut veri türü" yazmaya çok benzer.

@Lundin Gerçek dünya senaryosundaki dezavantajlardan bahsettiğiniz için teşekkür ederiz.
ffledgling

1

'Büyük O notasyonu' hakkında bir soru devam ederse ve bunu ölçmeye çalışırsanız, python'un şeyleri nasıl uyguladığı hakkında çok daha fazla şey bilmediğiniz sürece Python'da yapmak daha zor olabilir, örneğin bir Python listesi bağlantılı bir liste değildir ; Pythons sıralaması TimSort; Python çöpleri belirli zamanlarda toplar ...

Bir C programını bir işlemcide olması muhtemel olana bağlamak her zaman daha kolay buluyorum, ama burada bile işlemci önbelleği var; işletim sisteminin zaman dilimi; Sezgimi etkileyebilecek derleyici optimizasyonları vb.

Python kodunu yazmak ve hata ayıklamak için daha hızlı buluyorum, bu yüzden, bir seçenek verildiğinde, Python'da ilk önce işe yarayan bir şey elde etmeye konsantre olurdum. Bu çalışan Python programı ile genellikle daha büyük bir sisteme yerleştirebilir ve sadece çalıştığını değil, aynı zamanda yeterince hızlı olup olmadığını veya hangi yönden yavaş olduğunu öğrenebilirsiniz. Daha sonra bazı gerçek performans verileri elde etmek, hızı optimize ettiğinizde yardımcı olur ve Python sürümünü Python veya C veya daha sonra yeniden yazımlara karşı test etmenize olanak tanır.

Bu nedenle, sadece Python kullanmanın dezavantajları, işlemci modeline C benzeri bir derleme bekleyen yazılan algoritmaların faydalarını elde etmenin zor olabilmesidir. Sadece C kullanmanın dezavantajları belirttiğiniz gibidir: Yazmak ve hata ayıklamak için bir domuz ve kendi kitaplıklarınızı çok sık yazmak zorunda kalırsınız.

Bence onları (ve diğer dilleri) kullanmak, onların değiş tokuşlarını hissetene kadar kullanmak en iyisidir. Kendim iyi bir C kodlayıcıydı, ancak işimde hala C kodunu okumak (ve bazen hata ayıklamak) gerekse de, şimdi çok az orijinal C kodu yazıyorum. Her ne kadar Python'u tercih etsem de, biliyorum ve hala Perl ve Awk kullanıyorum (ve sed ve grep ve sort ve Tcl ve C ve ...).


İlk paragrafa katılmıyorum. Python, veri yapılarına güçlü bir vurgu yapar ve önceden tanımlanmış veri yapılarının nasıl uygulandığını açıkça belgeler. Tabii ki, çöp toplama çalışma zamanlarını eğecek, ancak büyük O düzenini nadiren eğecek.
Konrad Rudolph

1

Scala veya Clojure'a bakmanızı tavsiye ederim (ancak tip ek açıklamalarını kullanın). Bazı durumlarda C kadar hızlı olabilirler, diğer durumlarda C ( IMHO ) aksine çok dikkatli ve net bir gösterime sahipken , Ruby / Python'dan çok daha hızlıdırlar . Bunu C koduna karşı düşünün:

for (i <- 1 to 100; j <- 2 until 100;
     k <- 1 to 2; if i != j) {
     //...
}

Ayrıca , yineleme veya kuyruk çağrısı özyineleme kadar hızlı olmayan map, Ruby'nin / Python'ların filter, reducevb.


1

Bu dilleri sektörde kullanan / veya büyük yazılım / kütüphaneler vb. Geliştiren insanlardan duymak isterim.

Birkaç yıldır büyük bir C ++ kütüphanesinin küçük bir bölümünde çalıştım ve hem lisans hem de yüksek lisans tezimi bu kütüphane bağlamında yazdım. Kütüphane, tesadüfen, biyoinformatik algoritmalar ve veri yapıları için bir kütüphanedir.

Kütüphane C ++ ile oluşturulmuştur, çünkü C ++ bu kütüphanenin özel gereksinimleri ve genel olarak algoritmalar kütüphaneleri için neredeyse mükemmeldir. Başka bir algoritma kütüphanesi geliştirecek olsaydım ve dil seçimi benim olsaydı, neredeyse kesinlikle C ++ 'ı seçerdim.

Nedeni sadece performans değil, aynı zamanda her şeyden önce size daha fazla tip güvenliği sağlayan ve ikincisi, türlerinizin kullanılan algoritmayı belgelemesine izin veren güçlü tip sistemidir . Bu (tecrübelerime göre) okunabilirliği ve sürdürülebilirliği büyük ölçüde artırabilir.

Bununla birlikte, basit algoritmik karalamalar ve bulmacalar için, özellikle C ++ 'da bir problemi en iyi nasıl formüle edeceğimi denemek istemedikçe, neredeyse her zaman Python kullanıyorum (esas olarak evet, neredeyse sahte kod okur). Şimdiye kadar, SPOJ veya TopCoder sorunlarının çoğunu çözmedim, bu yüzden performansın hızlı bir dil kullanmanın çok önemli olduğu gerçekten kritik olup olmadığını bilmiyorum.

Ancak normalde önemli olan, geçmek için algoritmayı doğru yapmaktır. Bu durumlarda, Python gayet iyi çalışıyor. Örneğin, Project Euler sorunları (zamanlanmamış, sadece doğru çözüm sayıları için) için Python son derece uygundur.

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.