Standart sayısal algoritmalar için kitaplık kullanmama yaygın mıdır ve neden?


54

GSL gibi bilimsel hesaplama kütüphanelerinde birçok sayısal algoritma (entegrasyon, farklılaşma, enterpolasyon, özel fonksiyonlar vb.) Bulunmaktadır . Ancak bu kodların sık sık "elle toplanmış" uygulamalarını içeren kodlar görüyorum. Genel olarak kamuya açıklanması amaçlanmayan küçük programlar için, hesaplama bilim adamları arasında, sadece ihtiyaç duyduğunuzda (bir web sitesinden kopyalamak veya kopyalamak demek istediğim) sayısal algoritmaları kendiniz (ortak bir web sitesinden, Sayısal Tarifler veya benzeri) uygulamak yaygın bir uygulama mıdır? Eğer öyleyse, belirli bir neden yoktur önlemek GSL gibi bir şey bağlantı ya da başka bir şey, sadece daha fazla "gelenek" nedir?

Soruyorum çünkü kodun yeniden kullanılmasının büyük bir hayranıyım , bu da mümkün olan durumlarda mevcut uygulamaları kullanmaya çalışmam gerektiğini önerecektir. Ancak bu prensibin bilimsel hesaplamada genel programlamaya göre daha az değerli olmasının nedenleri olup olmadığını merak ediyorum .


Unutmayalım: Kütüphane kullanmanın açık bir yararı (uygulama hızı) olan Python gibi dillerin aksine, özellikle C ve C ++ hakkında soru soruyorum.


14
Bir yandan tekerleği yeniden icat etmek istemezsiniz. Öte yandan, bir algoritmayı anlamanın en iyi yolu (ve buna ek olarak, algoritmanın olağanüstü başarısız olduğu durumları kolayca teşhis etmek), bir uygulamayı kendiniz kodlamaya çalışmaktır.
JM

2
Karşılaştığınız her teoremi onaylıyor musunuz? Belki bir şans verir ve bazı bebek vakalarında oynarsınız, ancak araştırmanızın odağı değilse muhtemelen kabul edip hayata devam edersiniz.
saat

3
Fizikçiler programcı değillerdir ve başkalarının kodlarıyla başa çıkmak için kullanılmazlar (okurlar veya düzeltirler). Başkalarının kodunu kullanmak zorunda kaldıklarında, diğer fizikçiler tarafından yazılmış çok iyi yazılmış veya iyi yorumlanmış bir kod yoktur, tekrar kullanmaktan daha iyi bir şekilde yeniden yazmak daha iyi bir fikirdir. Bu, en azından bazı alanlarda / topluluklarda geçerlidir, ancak gençler arasında tutumlar değişmektedir. Yine de hepsi kötü değil, bunun için yeterince kolay bir kütüphane bulamazsa, kötü CS öğrencisinin bir şeyi yapamayacağı tutumu düşünün.
Szabolcs

Yanıtlar:


45

Her şeyi kendim uygulardım ama son zamanlarda kütüphaneleri daha çok kullanmaya başladım. Bir kitaplığı kullanmanın, kendinize bir rutin yazma zorunluluğunuzun olup olmadığının ötesinde birçok önemli avantaj olduğunu düşünüyorum. Bir kütüphane kullanıyorsanız,

  • Yüzlerce / binlerce / daha fazla kullanıcı tarafından test edilen kod
  • Sizin için herhangi bir çalışma yapmadan, gelecekte güncellenmeye ve geliştirilmeye devam edecek olan kod
  • İlk denemede yazdığınızdan daha verimli ve belki de daha ölçeklenebilir , optimize edilmiş kod
  • Kütüphaneye bağlı olarak, kodunuzda bir arayüz oluşturarak, şu anda kullanmadığınız ancak gelecekte kullanmak isteyebileceğiniz birçok algoritmaya erişebilirsiniz.

Yukarıdaki son madde işaret noktasında, Trilinos veya PETSc gibi büyük kütüphaneleri düşünüyorum . Bunu PyClaw'un geliştirilmesinde birkaç somut kişisel örnekle güçlendirebilirim . Her ne kadar Clawpack'i MPI çağrılarına paralel hale getirmek kolay olsa da, PETSc'i kullanmayı seçtik. Bu, paketteki paralle kodunu 300 satırdan az Python ile sınırlandırmamıza izin verdi, ancak daha da iyisi, verilerimizi PETSc biçiminde koyarak, PETSc'in örtülü çözücülerine derhal erişim sağlayarak PyClaw'da gizli bir çözücünün güncel çalışmasını sağladık. İkinci bir örnek olarak PyClaw başlangıçta beşinci sıradaki WENO yeniden inşasını içeren el kodunu içeriyordu, ancak sonunda PyWENO'ya güvenmeye karar verdik.Bunun için paket. PyWENO otomatik olarak herhangi bir siparişin WENO rutinlerini birkaç dilde üretebildiğinden, bu büyük bir kazançtı.

Son olarak, kütüphaneleri kullanırsanız, birçok başka insanın yararına olacak iyileştirmeler geliştirerek veya hataları bularak geri katkıda bulunabilirsiniz , oysa kendi kodunuzu hata ayıklamak veya iyileştirmek yalnızca size yarar sağlar.


5
"iyileştirmeler geliştirerek veya birçok insanın yararına olacak böcekleri bularak geri katkıda bulunabilirsiniz." - Bu hem “öğrenme / öğrenme” dürtüsünü hem de tembelliği tatmin edecek (daha önce yapılan şeyleri yapmak zorunda değilsiniz). :)
JM

1
Ayrıca bkz. Kenar kılıfları. Pek çok algoritma için, "işe yarayan" bir şeyi uygulamak önemsizdir, ancak vakaların bazı küçük alt kesimlerini doğru işlemeyecektir. Küçük bir proje için bu uygun olabilir, ancak kendimi "optimize ettiğim" bir şeye patolojik koşullar yüzünden kaçtığımın sayısını sayamıyorum.
meawoppl

34

Bir kütüphane işlevine, özellikle de o kütüphane programlayıcı için yeni ise, bağlantıda önemli bir programcı ek yükü vardır. Belirli bir kütüphanenin özelliklerini anlamak yerine basit algoritmaları yeniden yazmak genellikle daha kolaydır. Algoritmalar karmaşıklaştıkça bu davranış değişir.

Python, bu ek yükü pip / easy_install gibi araçlarla ve tek tip bir veri yapısı arayüzü ile azaltmada mükemmeldir (yani, her kitaplık bir rakam dizisi alıyor ve üretiyor gibi görünüyor).


19

Şu anda dahil olduğum projelerden biri, bir sınıf parçacık fiziği dedektörü için esnek bir simülasyon ve analiz paketi yazmak. Bu projenin amaçlarından biri sağlamaktır önümüzdeki on yıllar boyunca bu şeyler kullanılmak üzere kod tabanı.

Bu noktada, zaten iki düzine bağımlılığımız var, yapım sürecini Fermilab bilgisayar merkezinden yönetilen ayrı bir projeden çıkarıp sadece güvenilir bir alet zinciri sağlamak için kabus haline getiriyor.

Şimdi , o takım zincirinde olmayan bazı aletlere ihtiyaç duyduğunuzu hayal edin (sadece geçen ay başıma geldi). Üç seçeneğin var

  1. Kendin ol. İlgili tüm risk ve zorluklarla birlikte.
  2. Bazı kodları bir yerden kütüphaneden çıkartın ve Projeye yönlendirmesini de ekleyin. Yani, ilerlemeye devam etmek zorundasınız ve bu olduğunda başka birinin kodunu anlamanız gerekecek.
  3. Alet zincirini koruyan insanlara gidin, ihtiyaç duyduğunuz her şey için onlara yalvarın ve sonra onu elde etmek için serbest bırakma döngüsünü bekleyin . Bu adamlar oldukça duyarlı, ancak çalışma kodu olmadan ya da (1) veya (2) yaptıktan sonra durum için dava açmanız gerekiyor.

Seçmek çok kolay (1). Belki de çok kolay.


Evet, eklenen bağımlılıklar kitaplıkları kullanmanın önemli bir dezavantajıdır.
David Ketcheson,

Bağımlılıklar aklımdaki büyük dezavantajdır
Fomite

2
Cevabımın bağımlılık gerçeğine çok fazla ağırlık vermesi muhtemeldir ve büyük projelerde kurulu reklamların onaylanmasına dair bürokratik süreç konusunda yeterli değildir.
dmckee

* 3.
puanınız

Er ... hayır. Ne demek istediğimi yazıyor.
dmckee

12

Ben düşünüyorum olduğunu daha muhtemel bazı algoritmalar diğerlerinden daha yeniden uygulanmaya ile oldukça yaygın.

Bir kütüphanenin ne kadar sinir bozucu olduğu, algoritmayı kendiniz uygulamanın ne kadar zor olduğu, optimize etmenin ne kadar zor olduğu ve kütüphanenin ihtiyaçlarınızı ne kadar iyi karşıladığı arasında zorlu bir denge var. Ayrıca, bazen bir kütüphane kullanmak çok az şey ifade eder: Yavaş ikiye bölme algoritmasını programlarımdan birinde kullandım, çünkü bunu yalnızca birkaç kez aradım ve bunun için bir kütüphane eklemek istemedim.

İyi optimize edilmiş bir sürüm yazmak sizin için kolay mı? Öyleyse, yapmaktan daha iyi olabilirsin. İhtiyacınız olanı tam olarak alacaksınız ve kimsenin çalışmalarına bağlı kalmayacaksınız. Ancak elbette ne yaptığınızı gerçekten bilmeniz gerekiyor: basit algoritmalar bile uygulanması zor olabilir.

Bu konuda bir çalışma görmek isterdim, ancak önyargılı perspektifime göre, bilim adamları sıklıkla kütüphanelerin doğrusal cebir ve rastgele sayı üreteçleri için kullanılmasına neden oluyor, kalan kodların çoğu ev yapımı.


12
“Ama elbette ne yaptığınızı gerçekten bilmeniz gerekiyor: basit algoritmalar bile uygulamak zor olabilir.” - Bu yeterince vurgulanamaz.
JM,

10

Bir kütüphane kullanmak yerine bir algoritma uygulamanın bazen modelin daha iyi anlaşılmasını ve kontrol altına alınabileceğini düşünüyorum. Bilimsel hesaplamalar için bir program kodlarken, ne yaptığımı anlamak benim için önemli. Önemli algoritmaları uygulamak, problem hakkında daha iyi bilgi sahibi olmam ve daha iyi kontrol etmeme yardımcı oluyor.

Öte yandan, bazen bir çözüm bulmak için gerekli olan bir kütüphaneyi seçmek önemsiz bir iş değildir, bu nedenle ne elde etmeye çalıştığınızdan ve neden onu istediğinizden emin olduğunuzda, önceden uygulanmış algoritmaları aramak daha iyidir.

Algoritmalar karmaşıksa, bunları elle kodlamak, göreve özgü özellikleri kullanarak çözümün performansını / kalitesini geliştirme fırsatı sunar. Ve bazen algoritmayı biraz değiştirmek gerekir; bu, yazdığınız kodu biliyorsanız ve istediğiniz şekilde düzenleyebiliyorsanız daha kolaydır.


1
Anlayışı geliştirmek için +1. Bu, kendi algoritmalarınız için bir kütüphane rutini için bir sorun olmasına rağmen.
Faheem Mitha

8

Bir cevap, sayısal kodda çok küçük değişiklikler olduğu ve bunu bir kütüphaneye sığdırmanın gerçekten zor olduğu. Bunu, kurulumu genellikle kolay olan ve net bir girdi ve çıktı kümesine sahip web yazılımına kıyasla alın. Bence daha yaygın olanı, bir çerçeveyi ya da bir çerçeve gibi davranan büyük bir kütüphaneyi (Trilinos / PETSc) kaplayan insanlar ve bu ekosistemi topluluk kodlarını kullanmanın yararlarını elde etmek için kullanmak olduğunu düşünüyorum.


7

Kütüphanelerin kullanılıp kullanılmayacağına karar vermeden önce, bir kütüphanenin kullanımının kodunuza ne kadar yardımcı olacağını bulmak isteyeceğinizi düşünüyorum. Önemli bir hesaplama çekirdeği için iyi optimize edilmiş bir kütüphane kullanacaksanız, muhtemelen kendi yazınızı yazmaya çalışmaktan çok daha etkilidir.

Ancak, bir programın yürütülmesi sırasında yalnızca bir kez çağrılacak özel bir yordam yazıyorsanız, kodunuzu bir kütüphanenin gerektirdiği çerçeveye uyacak şekilde uyarlamanız buna değmeyebilir.

(Dikkate alınması gereken başka bir şey: kütüphaneden yararlanmak için ne kadar yeniden mimariye ihtiyacınız olacak? Kodu düzeltmek için harcadığınız çalışma saatleri, verimlilik veya sayısal doğrulukta karşılık gelen kazanımlarla telafi edilmediği sürece, uzun vadede buna değer. İdeal olarak, bu, başlangıçta veri yapılarını ve algoritmalarını tasarlarken planladığınız bir şeydir, böylece kütüphanenin "akışı" sıfırdan dikkate alınır.)


6

2 sentim.

Sadece C / C ++ 'dan ziyade, genel olarak bu konuda yazı yazmanın daha kolay olduğunu düşünüyorum. İlk olarak, Python gibi dillerdeki kütüphanelerin bir sonuç olsa bile, hızlı bir fayda sağlamak için kullanılması gerekmez. Sanırım @David nedenleri oldukça iyi karşıladı .

Dilin başından itibaren dil uygulaması bir dereceye kadar hangi kütüphanelere erişiminiz olduğunu belirler. Bilişim biliminde yaygın olarak kullanılan diller arasında C, C ++, Python, Perl, Java, Fortran ve R sayılabilir. Daha az yaygın örnekler Ocaml ve Common Lisp olabilir. Şimdi, bu dillerin çoğu C dilinde yazıldığından, C'ye doğal bir Yabancı İşlev arayüzüne sahiptirler. Ancak, Python'dan Perl kütüphanesi çağırmak pek de kolay değil. Yani pratikte insanlar ya

  1. Uygulama dilinde yazılmış, genellikle standart kütüphanelerin bir parçası olan veya başka şekilde yaygın olarak bulunan bir kitaplık kullanın veya

  2. Dilleri FFI aracılığıyla bir C / C ++ kütüphanesi arayın. Bu, bir sargının zaten var olmadığını varsayar, çünkü varsa, kolayca ayırt edilemez (1).

(2) genellikle daha zordur, çünkü C / C ++ fonksiyonunu kendiniz sarmanız gerekir. Ayrıca, kitaplığı paketlemeniz veya fazladan bir bağımlılık eklemeniz gerekir. Bu nedenle, insanların örneğin C'deki GSL kullanmak yerine yerleşik dil kitaplıklarını kullanma olasılıkları daha yüksektir.

Çok genel rutinler için, dağılımlardan rasgele örnekler üretmek, ya da integrallerin karesi gibi temel sayısal rutinler oluşturmak için, bazı kitaplıkları yeniden kullanmak kolay ve yaygındır. Birinin uygulamaya koymaya çalıştığı işlev daha karmaşık hale geldikçe, birinin başka bir kütüphanede istediği tam işlevi bulması ve hatta birisinin bile araştırmak ve sonunda işlevi uyarlamak için çok zaman harcayacağı ihtimalinin artması pek mümkün değildir. gerekli (örneğin kod stili / tasarımı bir sorun olabilir). Ve yukarıda tartışıldığı gibi, oradaki kütüphanelerin yalnızca bir alt kümesine erişilebiliyor. Öte yandan, eğer karmaşıksa ve ana odak noktası değilse bir algoritma kullanmak zor olabilir ve elbette bu sinir bozucu hız sorunlarıyla ilgilenmek zorundadır.

Böylece, maliyet / fayda analizinde bir optimizasyon problemi haline gelir. Tecrübelerim, MCMC gibi nispeten standart teknikler için bile, genellikle kendi kodumu yazmaya başladım çünkü genel yazılımı nasıl tasarladığımla daha iyi uyuyor.

Elbette, kodu kullanmasanız bile, başkalarının kodlarından ders almak mümkündür. Yine de, bilim adamlarının bunu yapmak için ne sıklıkla uğraştığını bilmiyorum. Benim izlenimim, başkalarının kodlarını öğrenmek için okumanın daha çok bir yazılım mühendisi olacağı yönünde.


6

İkinci yıl mekanik dersime geri dönersek, bana göre, bilinen algoritmaların kendi versiyonlarını uygulamamın bir kısmının bunu bu şekilde yapmam öğretildi. Lisansüstü fizik eğitimimde bir kütüphaneye nasıl bağlanabileceğimi ve bir kütüphaneye nasıl bağlanıldığını öğrettiğim tek bir örnek düşünemiyorum. FORTRAN'daki birleşmiş Newton denklemlerinin çözümünü kendim hesaplayan, ilk defa bir dönen golf topunun koordinatlarının bir listesini görmekten hoşlanıyorum. Bazı şeyleri sıfırdan hesaplamaktan kaynaklanan bir heyecan ve memnuniyet (hatta gurur) var.


1
Bu kesinlikle bir faktördür. Ve buna odaklanmak kendin yap, hesaplamalı bir bilim insanının eğitiminin bir parçası için gereklidir. Saf programcılar bir noktada onlardan kurtulmalarını sağlıyor, ancak biz bilim türleri bu tanıtım sınıfından neredeyse aynı yoldan gelen diğer insanlar tarafından neredeyse sadece öngörülen bir nüfusluya geçebiliyor.
dmckee

5

Sanırım test edilmiş kütüphaneleri mümkün olduğunca kullanmalıyız. Çoğu insan sayısal hesaplama konusunda uzman değildir ve muhtemelen iyi test edilmiş kitaplıklarda bulunanlar kadar doğru ve dikkatli bir çözüm uygulayamaz. Bununla birlikte, bazen, belirli bir uygulamada ihtiyaç duyulan yeteneklerin birleşimini uygulayan mevcut kütüphanelerin olmadığı durum söz konusudur. Bunun çalıştığım teknik alanda olduğunu gördüm; Mevcut kodlar tüm vakaları çözmedi ve birileri çözen sıfırdan bir çözücü uyguladı.


1
Kütüphane tüm ihtiyaçlarınızı karşılamıyorsa, kütüphane kodunu genişletmenizi ve bir düzeltme eki göndermenizi öneririm. Bu şekilde işinizde birçok kişiye fayda sağlayacaksınız ve diğerleri de kodunuzu sizin için test edecek. Elbette bu, kütüphane kodunun ihtiyaçlarınızı karşılamak için genişletilebilecek kadar esnek bir şekilde yazıldığını varsayar.
David Ketcheson

Kabul ediyorum, bu harika bir çözüm ve eğer mümkünse insanların yapması gereken bir şey var.
mhucka

5

Temel problem genellikle uygulama ile kütüphane arasındaki arayüzdür. Bir uygulama programcısı, problemi (örneğin bir matris olarak) bir kütüphaneye geçirirken sıklıkla kaybedilen problem hakkında bilgi sahibidir. Bu bilgi, onu en iyi şekilde kullanmanın, yüksek düzeyde optimize edilmiş kütüphaneyi kullanmanın yararlarını dengelemekten ötedir. Sonuç olarak, uygulama programcısı bilgiden yararlanan kendi uygulamasını "yuvarlar".

Bu nedenle, gerçekten iyi bir kütüphanenin, bu bilginin uygulamadan kütüphaneye aktarılması gerekir, böylece kütüphane de bundan faydalanabilir.


3

Yukarıda belirtilenlerin yanı sıra, "Fortran vs C ++" sorusundaki cevabımı tekrarlayacağım: Bir programcının sahip olduğu en değerli varlık onun zamanıdır. Evet, dış bağımlılıklar genellikle gariptir. Ancak, başkalarının zaten uyguladıkları algoritmaları yeniden uygulamak, hata ayıklamak ve test etmek için zaman harcamak neredeyse her zaman aptalcadır ve sonuç nadiren belirli bir konuda uzmanlar tarafından yazılmış kod kadar iyi olacaktır. Başkalarının yaptıklarını tekrar kullanın!


Bu konuda kendi cevabımı veriyorum. Tüm detayları tekrar yazarken daha fazlasını öğrenebilirsiniz. Artık nokta bulutlarla 5-6 yıl çalışıyorum. İlk üç yıl bütün işlevleri kendim yazdım. İkinci yarı, Point Cloud Library'yi kullanarak geçirdim. Kanıtlayamıyorum, ancak ilk üç yılı başkalarının sağladığı çözümler hakkında düşünmekle geçirerek PCL'de kendimi daha güçlü bir uzman olarak görüyorum.
Jan Hackenberg,

@JanHackenberg - evet, ama ben de köreleyim: Hayatın üç yılını yeniden icat eden tekerlekleri boşa harcadın. Başkalarının yaptığı şeyi kullanmış olsaydınız, ne kadar yeni şey yapabileceğinizi düşünün !?
Wolfgang Bangerth,

İlk doktora yılımda Java ile yazmaya karar verdim çünkü şu anda programlama becerilerimi (bilişim teorisi değil) sıfıra yakın buldum. Java hala pratikte en iyi olduğum dildi. Ayrıca, çoklu platform desteği nedeniyle Java'yı iyi bir seçenek olarak görmüştüm. Doktorada (geleneksel ormancılık) bilgilendirici desteği olmayan bir sandalyeye girdim. Hatamı farkettiğimde ve yapabildiğimde c ++ 'a atladım (yayınlamadan önce değil).
Jan Hackenberg,

BTW Hayatımın 3 yılını boşa harcamak konusunda aynı fikirde değilim. Bu, doktora sonrası doktora deneyimimde sadece iki faydalı yılım olduğu anlamına geliyor. Bugün bir ormancılık noktası bulutuna 10 milyar tüp sığdırabilirim ve makinenin hangi ağaçları temsil edeceğine karar vermesine izin verebilirim. ~ 50 kullanıcılarım da bunu yapabilir. ~ 1 saat içinde Tüm hileleri zor ve zaman alıcı bir şekilde öğrenerek öğrendim. Vi'yi nasıl kullanacağımı asla öğrenmemeye karar verdim, ancak gerekli öğrenme eğrisinden geçen insanlar kod üretmek için en verimli yolu kullandıklarını iddia ettiğine inanıyorum.
Jan Hackenberg

2

Çalıştığım grup, kütüphaneleri olabildiğince kullanıyor. Ben birkaç programcıdan biriyim ve geri kalanlar işini programlamaya başladılar. Nerede olmamaları gerektiğini bilmek için kendi sınırlamalarını yeterince biliyorlar. IMSL tercih edilen kütüphanedir. GSL gibi şeyler, federal bir kuruluş olmasına rağmen lisanslama kısıtlamaları nedeniyle yasaklanacak ve yazılımımızı yine de vereceğiz.


2

“Yeniden kullanım öncelikle sosyal bir olgudur. Bu şartlar altında başka birinin yazılımını kullanabilirim.

  1. işe yarıyor
  2. anlaşılabilir
  3. birlikte olabilir
  4. desteklenir (veya kendim desteklemeye istekliyim, çoğunlukla değilim)
  5. ekonomiktir
  6. Onu bulabilirim.

"- B. Stroustrup, C ++ Programlama Dili 2 ed. (1991) s. 383.


1

Başkaları tarafından kütüphane kullanımı ve ayrıca kendi rutinlerinizi hazırlamanız için birçok iyi sebep verilmiştir.

Bazen belirli bir uygulama için hesaplamaları hızlandırabilirsiniz, çünkü önceden kitaplık yordamının kapsadığı geniş bir değer aralığına veya bu yordamların sağladığı hassasiyete asla ihtiyacınız olmayacağını biliyorsunuzdur.

Tabii ki, birçok uygulama özel uygulamaya ve kütüphane rutininin kaç kez çağrılacağına bağlıdır. Bessel için neden bir kütüphane rutini çağırıyorsunuz, küçük bir x aralığı için sadece birkaç önemli rakama ihtiyacınız varsa ve ihtiyaçlarınız için daha basit bir teknik yeterli mi?


0

Eklemek için çok az, kodu yeniden kullanmak zorundayız, kod sürdürülebilirliği ve topluma katkısı ile ilgili, ama hepsi bu kadar.

Kodu tekrar kullanmamamızın nedeni, programlayıcıyı başlatıyorsanız diğerlerinin kodunu anlamak zor olmasıdır. Gelişmiş C ++ ile özellikle zor ve bazı püf noktalarını saf C de yapabilirsiniz.

Çok sık başlangıçta, biri yöntemde anlaşılır, ancak kütüphanede uygulandığı şekliyle değil, ya da kütüphanenin genel arayüzü, hata kontrolü ve konvansiyonları ile nasıl kullanılacağı, ancak çoğu zaman deneyimli programcılar için belgelendirildiği şekliyle anlaşılır. Bu, kendiniz için LU faktoringi gibi standart bir yöntemi uygulamak için daha iyi bir yanılsama verir. Ayrıca, yeni programcılar farklı işletim sistemleri için kod testi, doğrulama ve taşınabilirlik değerlerini hafife alır. Sonuçta tembellik, kendi kodlarını yazmak daha hızlı ve kolay bir çözüm gibi görünüyor.

Gerçek şu ki, kodu kullanarak ve okuyarak baştan programlamaktan daha fazlasını öğrenebiliriz.

Tembellik beni çoğu zaman tahrik ediyor, sanırım insanların da çoğunluğu. Aynı sebepten, bazıları sıfırdan kod yazıyor, bazıları ise mevcut kütüphaneleri kullanıyor.


-1

Kütüphaneler algoritmaları, kendi uygulamalarının aksine:

  • Bunlar genel ve ayarlıdır. Daha sonra birçok kısıtlama olması beklenen kendi kodunuzu değiştirmekten endişe duymadan uygulamanızı yeniden değerlendirebilirsiniz.
  • Dejenere giriş verisi vakalarına karşı tasarruf vardır. Dışbükey gövdeli olanlar gibi çok sayıda hesaplama geometrisi algoritması, örneğin üç noktanın eşzamanlılığını ele almalıdır. Kodunuzu asla dağıtmayı planlamıyorsanız ve ayrıca gelecekte kodunuzu tekrar kullanmak istemiyorsanız bu durumları görmezden gelebilirsiniz.
  • Beklenen ya da en kötü durum giriş yapılandırmaları için asgari çalışma zamanı karmaşıklığı sağlarlar. Daha yüksek seviyeli algoritmalar, inşa tuğlaları gibi daha düşük seviyeli algoritmalara sahiptir, örneğin sıralama algoritmaları veya özel veri türleri. Hızlı sıralama, verileri sıralamak için en yaygın seçenek olabilir, ancak algoritma uygulamanızın n (log (n)) garantisini vermesi gerekiyorsa, kullanamazsınız.
  • Hafıza kullanımı verimli
  • Daha fazla çalışma zamanı optimize edildi
  • Destekleniyorsa, özellikle ana şubeyle çalışıyorsanız, genel olarak ücretsiz "böcek" olmak üzere çok daha kapalı. Hiçbir şey iyi dağıtılmış bir kütüphaneden daha test edilmez. Her hata çökmez, her hata makul olmayan sonuçlar üretmez. Algoritmanızın uygulanması, tasarlandığı kadar iyi değil, yine de kabul edilebilir sonuçlar üretebilir. Bir hata ne kadar az görünür olursa, tek bir kişi olarak sizin bile tespit edebilmeniz o kadar az olasıdır.

İyi anlaşılabilir bir algoritmanın bir versiyonunu kendi başınıza uygulamak için yeni bir alana girerken hala iyi olduğunu düşünüyorum. Toplamda çok zaman alır. Press ve ark. Adlı kitapları satın alıp okudum. Bu uygulamalardan önce ve bu sırada her zaman çok teori okurum. Ve bir alanın genel kavramlarını anladıktan ve tuzakları benim için pratikte tecrübe ettikten sonra, her yönüyle daha iyi kütüphane uygulamalarına atlamanın zamanı gelmiştir. Kendi kütüphanelerinizde "merhaba dünyası" algoritması yazarsanız, kütüphanenin daha iyi bir kullanıcısı olacağınızı düşünüyorum.

Daha büyük bir takımda çalışıyorsanız, ekibinizin belirli bir kütüphane kullanıp kullanmamasına karar vermek kendi tercihiniz olmayabilir. Çekirdek ekip kararı verebilir. Ve projenizde kütüphanenin bağlayıcılığından sorumlu bir kişi kendi zaman planlarıyla olabilir. Diğer insanların kararına güvenmek yerine, kendi zaman planlamanızla yapabileceğiniz bir algoritmayı yeniden yazmak.

Eğer kendi başınıza ve dağıtmak istiyorsanız, başka bir sorun var. En kullanışlı kaynak olarak birçok kaynak kodun yanı sıra olduğunu düşünüyorum. Tüm bilişimciler için çoğu burada hemfikir olabilir. Bilişimin dışındaki uygulamalı bir alanda, pencerelerde önceden derlenmiş bir exectuable oluşturmak için gerekli olabilir. Linux altında, açık kaynaklı kullanım kütüphaneleri durumunda, işleri kendi başınıza nispeten kolay bir şekilde ayarlayabilirsiniz.

Bir algoritmayı kendi başınıza yeniden yazmak, lisans özgürlüğü verir. Projeniz desteklemiyor olabilir GPL ait lisanslaması GSL örneğin.

İzin, araştırma yapanların bakış açısından bağımsız olan tek kısıt olabilir.


1
"Bir algoritmayı kendi başınıza uygulamanın" ve "kütüphane sözdizimini öğrenmenin" "aynı anda mal olacağını" düşünmek akıl almazdır. Bu "strcat" gibi basit fonksiyonlar için bile doğru değildir. Bu, kesinlikle LAPACK'te, örneğin veya daha üst düzey kütüphanelerde bulunan herhangi bir şey için geçerli değildir.
Wolfgang Bangerth

@WolfgangBangerth Geri bildiriminiz için teşekkür ederiz. Yazdıklarını yeniden okudum ve kendi uygulamalarının birleştirilebilir olduğu mesajını aktarmak istemedim. Ama çok şey öğrendim. Benim "her ikisi de iki haftaya mal olabilir" iyi bir örnek değildi. Aslına bakılırsa, Java'dan C ++ 'a geçtiğimde 2 hafta "sözdizimini öğrenme" en son bana mal oldu ve bu zamanda temel C ++ sözdizimini de öğrendim. Pointer'larla daha sonra yeni kütüphanemle daha çok mücadele ettim. Uyguladığım algoritmaların herhangi birinde iki hafta benim küçük yatırımım olan kodlama zamanı olabilir (daha önce kitap okumak çok daha fazla zaman alır).
Jan Hackenberg

Yatırım küçük bir algoritma yazmıyor. Bu hızlıdır ve bazen başka bir kütüphane öğrenmekle zaman alabilir. İnanılmaz derecede zaman harcayan şey, şeylerin hatalarını ayıklamak ve tüm köşe davalarını düzeltmek. İyi gelişmiş bir kütüphane kullanıyorsanız, matris-vektör ürünü kare matrisler için çalışıyorsa, dikdörtgen matrisler için de işe yarayacağını biliyorsunuz. Kendi yazılımınız için, işlevin tamamlandığını düşündüğünüz halde, bunu uygulayabilir ve hata ayıklayabilirsiniz. Aynı işleve birçok kez geri döneceksiniz. Bu zamana mal oluyor.
Wolfgang Bangerth

@WolfgangBangerth Tüm Argümanlarınızla aynı fikirdeyim. Tek amacım, bu Köşe davalarını kendin halletmen gerektiğinde daha fazla teori öğrenmen. Cevabımın ilk versiyonu gerçekten bir fark yaratmıyor gibi geldi. Çok yorgundum. Gelişmiş cevabı, kütüphanelerin istikrarlılık faydaları hakkında çok daha fazla yazıyorum. Benim için harcanan zaman ile Kazanılan Bilgi arasında bir takas.
Jan Hackenberg,
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.