Banyak algoritma numerik (integrasi, diferensiasi, interpolasi, fungsi khusus, dll.) Tersedia di perpustakaan perhitungan ilmiah seperti GSL . Tapi saya sering melihat kode dengan implementasi "linting" dari fungsi-fungsi ini. Untuk program-program kecil yang tidak dimaksudkan untuk distribusi publik, apakah merupakan praktik yang umum di antara para ilmuwan komputasi untuk hanya mengimplementasikan algoritma numerik sendiri (maksud saya menyalin atau menyalin dari situs web, Resep Numerik, atau serupa) ketika Anda membutuhkannya? Jika demikian, apakah ada alasan khusus untuk menghindari tautan ke sesuatu seperti GSL, atau hanya "tradisi" daripada yang lainnya?
Saya bertanya karena saya penggemar penggunaan kembali kode , yang akan menyarankan saya harus mencoba menggunakan implementasi yang ada bila memungkinkan. Tapi saya ingin tahu apakah ada alasan bahwa prinsip kurang berharga dalam perhitungan ilmiah daripada dalam pemrograman umum.
Lupa menyebutkan: Saya secara khusus bertanya tentang C dan C ++, yang bertentangan dengan bahasa seperti Python di mana ada manfaat yang jelas (kecepatan eksekusi) untuk menggunakan perpustakaan.
Jawaban:
Saya biasa mengimplementasikan semuanya sendiri, tetapi akhir-akhir ini sudah mulai menggunakan perpustakaan lebih banyak. Saya pikir ada beberapa keuntungan yang sangat penting dari menggunakan perpustakaan, di luar masalah apakah Anda harus menulis rutin sendiri atau tidak. Jika Anda menggunakan perpustakaan, Anda dapatkan
Pada poin terakhir di atas, saya memikirkan perpustakaan besar seperti Trilinos atau PETSc . Saya bisa memperkuat ini dengan beberapa contoh pribadi nyata dalam pengembangan PyClaw . Meskipun akan mudah untuk menyejajarkan Clawpack dengan panggilan MPI, kami memilih untuk menggunakan PETSc. Ini memungkinkan kami untuk membatasi kode paralle dalam paket menjadi kurang dari 300 baris Python, tetapi lebih baik lagi, dengan meletakkan data kami dalam format PETSc, kami memperoleh akses langsung ke pemecah implisit PETSc, memungkinkan pekerjaan saat ini pada pemecah implisit di PyClaw. Sebagai contoh kedua, PyClaw awalnya memasukkan kode tangan rekonstruksi WENO orde lima, tetapi kami akhirnya memutuskan untuk mengandalkan PyWENOpaket untuk ini. Ini adalah keuntungan besar, karena PyWENO dapat secara otomatis menghasilkan rutinitas WENO dari berbagai pesanan dalam beberapa bahasa.
Terakhir, jika Anda menggunakan pustaka, Anda dapat berkontribusi kembali dengan mengembangkan perbaikan atau menemukan bug, yang akan menguntungkan banyak orang lain, sedangkan men-debug atau meningkatkan kode Anda sendiri hanya menguntungkan Anda.
sumber
Ada overhead programmer besar yang terlibat dalam menghubungkan ke fungsi perpustakaan, terutama jika perpustakaan itu baru bagi programmer. Seringkali lebih sederhana untuk hanya menulis ulang algoritma sederhana daripada mencari tahu spesifik dari perpustakaan tertentu. Ketika algoritme menjadi lebih kompleks perilaku ini beralih.
Python telah unggul dalam mengurangi overhead ini dengan alat-alat seperti pip / easy_install dan antarmuka struktur data yang seragam (yaitu setiap perpustakaan tampaknya mengambil dan menghasilkan array numpy).
sumber
Salah satu proyek yang saya terlibat saat ini adalah menulis paket simulasi dan analisis yang fleksibel untuk kelas detektor fisika partikel. Salah satu tujuan dari proyek ini adalah untuk memberikan yang basis kode yang akan digunakan dalam hal-hal ini selama beberapa dekade yang akan datang.
Pada titik ini, kami sudah memiliki dua lusin dependensi, membuat proses pembangunan menjadi mimpi buruk sehingga telah memutar proyek terpisah yang dikelola dari pusat komputasi Fermilab hanya untuk menyediakan rantai alat yang andal.
Sekarang bayangkan Anda menemukan kebutuhan untuk beberapa alat yang tidak ada dalam rantai-alat itu (terjadi pada saya bulan lalu). Anda punya tiga pilihan
Sangat mudah untuk memilih (1). Mungkin terlalu mudah.
sumber
Saya pikir itu adalah sangat umum, dengan beberapa algoritma lebih mungkin kembali dilaksanakan daripada yang lain.
Ada trade-off yang rumit antara betapa menjengkelkannya sebuah perpustakaan untuk diinstal, betapa sulitnya untuk mengimplementasikan algoritma sendiri, seberapa sulit untuk mengoptimalkannya, dan seberapa baik perpustakaan sesuai dengan kebutuhan Anda. Juga, kadang-kadang menggunakan perpustakaan hanya berlebihan: Saya menggunakan algoritma pembelahan dua lambat di salah satu program saya karena saya menyebutnya hanya beberapa kali dan saya tidak ingin menambahkan perpustakaan hanya untuk itu.
Apakah mudah bagi Anda untuk menulis versi yang dioptimalkan dengan baik? Jika ya, Anda mungkin lebih baik melakukannya. Anda akan mendapatkan apa yang Anda butuhkan dan Anda tidak akan bergantung pada pekerjaan siapa pun. Tapi tentu saja Anda benar-benar perlu tahu apa yang Anda lakukan: bahkan algoritma sederhana pun bisa sulit untuk diterapkan.
Saya ingin tahu melihat studi tentang ini, tetapi dari perspektif bias saya, para ilmuwan sering menggunakan perpustakaan untuk aljabar linier dan generator angka acak, dengan sebagian besar kode yang tersisa dibuat di rumah.
sumber
Saya pikir menerapkan algoritma alih-alih menggunakan perpustakaan terkadang dapat memberikan pemahaman dan kontrol model yang lebih baik. Ketika saya mengkode beberapa program untuk perhitungan ilmiah, penting bagi saya untuk memahami apa yang saya lakukan. Menerapkan algoritma penting membantu saya mendapatkan pengetahuan yang lebih baik tentang masalah dan mencapai kontrol yang lebih baik.
Di sisi lain, kadang-kadang bukan tugas sepele untuk memilih perpustakaan yang diperlukan untuk mendapatkan solusi, jadi lebih baik untuk mencari algoritma yang sudah diterapkan ketika Anda yakin apa yang ingin Anda capai dan mengapa Anda menginginkannya.
Jika algoritme itu kompleks, maka mengkodekannya dengan tangan memberi Anda peluang untuk meningkatkan kinerja / kualitas solusi menggunakan fitur spesifik tugas. Dan kadang-kadang perlu untuk mengubah algoritma sedikit, yang lebih mudah jika Anda tahu kode yang Anda tulis dan Anda dapat mengeditnya dengan cara yang Anda inginkan.
sumber
Salah satu jawabannya adalah ada begitu banyak variasi kecil pada kode numerik sehingga sangat sulit untuk merangkumnya di perpustakaan. Ambil ini dibandingkan dengan perangkat lunak web, yang sering kali mudah dipasang dan memiliki serangkaian input dan output yang jelas. Saya pikir yang lebih umum adalah orang-orang mengambil kerangka kerja, atau perpustakaan besar yang bertindak seperti kerangka kerja (Trilinos / PETSc), dan menggunakan ekosistem itu untuk mendapatkan manfaat menggunakan kode komunitas.
sumber
Sebelum memutuskan apakah akan menggunakan perpustakaan atau tidak, saya pikir Anda juga ingin mengetahui seberapa banyak penggunaan perpustakaan akan membantu kode Anda. Jika Anda akan menggunakan pustaka yang dioptimalkan dengan baik untuk kernel komputasi utama, maka itu mungkin jauh lebih efisien daripada mencoba menulis sendiri.
Namun, jika Anda menulis rutin khusus yang hanya akan dipanggil sekali selama pelaksanaan program, mungkin tidak layak untuk mengadaptasi kode Anda agar sesuai dengan kerangka kerja yang diperlukan oleh perpustakaan.
(Satu hal lagi yang perlu dipikirkan: berapa banyak arsitek yang akan Anda perlu lakukan untuk mengambil keuntungan dari perpustakaan? Kecuali jika orang-jam yang Anda habiskan untuk memperbaiki kode dikompensasi oleh perolehan yang sesuai dalam efisiensi atau akurasi numerik, mungkin tidak sepadan dengan itu dalam jangka panjang. Idealnya, ini adalah sesuatu yang Anda rencanakan ketika awalnya merancang struktur data dan algoritma, sehingga "aliran" perpustakaan diperhitungkan dari bawah ke atas.)
sumber
2 sen saya.
Saya pikir lebih mudah untuk menulis secara umum tentang ini, daripada hanya tentang C / C ++. Pertama, perpustakaan dalam bahasa seperti Python tidak selalu digunakan untuk mendapatkan manfaat kecepatan, bahkan jika itu konsekuensinya. Saya pikir @David membahas alasannya dengan cukup baik.
Mengambilnya dari atas, implementasi bahasa sampai batas tertentu menentukan perpustakaan apa yang Anda punya akses. Bahasa yang umum digunakan dalam ilmu komputasi termasuk C, C ++, Python, Perl, Java, Fortran, dan R. Contoh yang kurang umum mungkin Ocaml dan Common Lisp. Sekarang, karena sebagian besar bahasa ini ditulis dalam C, mereka memiliki antarmuka fungsi asing alami ke C. Namun, tidak begitu mudah untuk memanggil, katakanlah, perpustakaan Perl dari Python atau sebaliknya. Jadi dalam praktiknya orang cenderung juga
Gunakan perpustakaan yang ditulis dalam bahasa implementasi mereka, biasanya sesuatu yang merupakan bagian dari perpustakaan standar, atau tersedia secara luas, atau
Panggil perpustakaan C / C ++ melalui bahasa FFI. Ini mengasumsikan bahwa pembungkus belum ada, karena jika tidak, itu tidak mudah dibedakan dari (1).
(2) biasanya lebih sulit, karena Anda harus membungkus sendiri fungsi C / C ++. Anda juga harus mem-bundle pustaka, atau menambahkan ketergantungan tambahan. Untuk alasan itu, orang lebih cenderung menggunakan perpustakaan bahasa builtin daripada menggunakan GSL misalnya, yang ada di C.
Untuk rutinitas yang sangat umum, katakanlah menghasilkan sampel acak dari distribusi, atau rutinitas numerik dasar seperti kuadrature integral, mudah dan umum untuk menggunakan kembali beberapa perpustakaan. Ketika fungsi yang coba diimplementasikan menjadi lebih kompleks, secara eksponensial menjadi semakin tidak mungkin bahwa seseorang akan menemukan fungsi persis yang diinginkan di pustaka lain, dan bahkan yang dilakukan, seseorang dapat menghabiskan banyak waktu mencari dan akhirnya mengadaptasi fungsi sebagai diperlukan (gaya kode / desain bisa menjadi masalah misalnya). Dan seperti yang dibahas di atas, seseorang hanya memiliki akses ke sebagian perpustakaan di luar sana. Di sisi lain, mengimplementasikan algoritma sendiri jika kompleks dan bukan fokus utama dapat menjadi sesuatu yang menakutkan, dan tentu saja kita harus berurusan dengan masalah kecepatan sial itu.
Jadi, ini menjadi masalah optimasi dalam analisis biaya / manfaat. Pengalaman saya adalah bahwa bahkan untuk teknik-teknik standar komparatif seperti MCMC, saya biasanya berakhir dengan menulis kode saya sendiri, karena lebih cocok dengan bagaimana saya merancang perangkat lunak secara keseluruhan.
Tentu saja, bahkan jika Anda akhirnya tidak menggunakan kode tersebut, dimungkinkan untuk belajar dari kode orang lain. Saya tidak tahu seberapa sering para ilmuwan benar-benar repot untuk melakukan ini. Kesan saya adalah bahwa membaca kode orang lain untuk dipelajari lebih merupakan masalah insinyur perangkat lunak.
sumber
Berpikir kembali ke kursus mekanik tahun kedua saya, terpikir oleh saya bahwa sebagian alasan saya telah mengimplementasikan versi saya sendiri dari algoritma yang terkenal adalah bahwa saya diajari untuk melakukannya dengan cara itu. Saya tidak dapat memikirkan satu contoh pun di mana saya diajari cara antarmuka dan tautan di perpustakaan dalam pendidikan fisika sarjana saya. Saya memiliki ingatan yang bagus untuk melihat untuk pertama kalinya daftar koordinat bola golf yang berputar, setelah menghitung solusi persamaan Newton yang digabungkan dalam FORTRAN sendiri. Ada sensasi dan kepuasan tertentu (bahkan kesombongan) yang datang dari menghitung sesuatu dari awal.
sumber
Saya pikir orang harus menggunakan perpustakaan yang diuji sebanyak mungkin. Kebanyakan orang bukan ahli dalam komputasi numerik dan mungkin tidak akan dapat mengimplementasikan solusi dengan benar dan hati-hati seperti yang tersedia di perpustakaan yang telah teruji. Yang mengatakan, bagaimanapun, kadang-kadang terjadi bahwa tidak ada perpustakaan yang tersedia yang menerapkan kombinasi kemampuan yang dibutuhkan dalam aplikasi yang diberikan. Saya telah melihat ini terjadi di bidang teknis di mana saya bekerja; kode yang ada tidak menyelesaikan semua kasus, dan seseorang akhirnya menerapkan pemecah masalah dari awal.
sumber
Masalah mendasar seringkali dengan antarmuka antara aplikasi dan perpustakaan. Pemrogram aplikasi memiliki pengetahuan tentang masalah yang sering hilang ketika melewati masalah (misalnya sebagai matriks) ke perpustakaan. Pengetahuan ini sedemikian rupa sehingga memanfaatkannya lebih dari mengimbangi manfaat menggunakan perpustakaan yang sangat dioptimalkan. Akibatnya, pemrogram aplikasi "memutar" implementasinya sendiri yang mengeksploitasi pengetahuan.
Dengan demikian, perpustakaan yang sangat bagus perlu agar pengetahuan semacam itu dapat diteruskan dari aplikasi ke perpustakaan, sehingga perpustakaan juga dapat memanfaatkannya.
sumber
Selain semua hal yang sudah dikatakan di atas, saya akan mengulangi jawaban saya dari pertanyaan "Fortran vs C ++": Aset paling berharga yang dimiliki seorang programmer adalah waktunya. Ya, ketergantungan eksternal seringkali canggung. Tetapi menghabiskan waktu untuk mengimplementasikan kembali, men-debug dan menguji algoritma yang telah dilaksanakan orang lain hampir selalu bodoh, dan hasilnya juga jarang akan sebagus kode yang ditulis oleh para ahli pada topik tertentu. Gunakan kembali apa yang telah dilakukan orang lain!
sumber
Grup saya bekerja dengan menggunakan perpustakaan sebanyak mungkin. Saya salah satu dari sedikit programmer, dan yang lainnya mengambil program di tempat kerja. Mereka cukup tahu keterbatasan mereka sendiri untuk mengetahui di mana mereka seharusnya tidak mencoba-coba. IMSL adalah perpustakaan yang disukai. Hal-hal seperti GSL akan dilarang karena batasan lisensi, meskipun ini adalah agen federal dan kami tetap memberikan perangkat lunak kami.
sumber
"Penggunaan kembali pada dasarnya adalah fenomena sosial. Saya dapat menggunakan perangkat lunak orang lain asalkan
"- B. Stroustrup, Bahasa Pemrograman C ++ 2 ed. (1991) hlm. 383.
sumber
Beberapa alasan bagus telah diberikan oleh orang lain untuk menggunakan perpustakaan, dan juga untuk menjalankan rutinitas Anda sendiri.
Anda kadang-kadang dapat mempercepat perhitungan untuk aplikasi tertentu karena Anda tahu sebelumnya bahwa Anda tidak akan pernah membutuhkan rentang nilai yang luas yang dicakup oleh rutinitas perpustakaan, atau keakuratan yang dihasilkan oleh rutinitas tersebut.
Tentu saja, banyak tergantung pada aplikasi tertentu dan berapa kali rutin perpustakaan akan dipanggil. Mengapa Anda memanggil rutin perpustakaan untuk fungsi Bessel milyaran kali jika Anda hanya memerlukan beberapa angka penting untuk rentang kecil x, dan beberapa teknik sederhana akan cukup untuk kebutuhan Anda?
sumber
Sedikit untuk ditambahkan, kita harus menggunakan kembali kode, ini tentang keberlanjutan kode dan kontribusi kepada masyarakat, tetapi itu semua di atas.
Alasan mengapa kami tidak menggunakan kembali kode adalah bahwa jika Anda memulai programmer sulit untuk memahami kode orang lain. Ini sangat sulit dengan C ++ lanjutan, dan Anda dapat melakukan beberapa trik dalam C murni juga.
Sangat sering pada awalnya, orang mengerti metode ini, tetapi tidak seperti yang diterapkan di perpustakaan, atau hanya bagaimana menggunakan perpustakaan dengan antarmuka generik, kontrol kesalahan dan konvensi, sangat sering didokumentasikan untuk programmer berpengalaman jika sama sekali. Ini memberikan ilusi yang lebih baik untuk menerapkan metode standar, seperti faktorisasi LU sendiri. Selain itu, programmer baru meremehkan nilai pengujian kode, validasi dan portabilitas untuk sistem operasi yang berbeda. Jadi pada akhirnya alasannya adalah kemalasan, menulis kode sendiri sepertinya sebagai solusi yang lebih cepat dan mudah.
Kenyataannya adalah kita bisa belajar lebih banyak dengan menggunakan dan membaca kode daripada memprogram sendiri dari awal.
Kemalasan mendorong saya untuk sebagian besar waktu, saya pikir juga mayoritas orang. Untuk alasan yang sama, beberapa menulis kode dari awal dan lainnya menggunakan pustaka yang ada.
sumber
Algoritma perpustakaan memberikan kontras dengan implementasi sendiri:
Saya masih menganggap itu baik ketika memasuki bidang baru untuk mengimplementasikan satu versi dari algoritma yang dapat dipahami dengan baik pada Anda sendiri. Saya membutuhkan banyak waktu secara total. Saya membeli dan membaca buku, yang bernama Press et al. Saya selalu membaca banyak teori sebelum dan selama implementasi tersebut. Dan setelah memahami konsep umum bidang dan mengalami jebakan dalam praktiknya bagi saya, inilah saatnya untuk beralih ke semua aspek implementasi perpustakaan yang lebih baik. Saya pikir Anda akan menjadi pengguna perpustakaan yang lebih baik jika Anda menulis algoritme "halo dunia" di bidang perpustakaan sendiri.
Jika Anda bekerja di tim yang lebih besar itu mungkin bukan pilihan Anda sendiri apakah tim Anda menggunakan perpustakaan tertentu atau tidak. Tim inti mungkin melakukan keputusan. Dan mungkin ada orang yang bertanggung jawab atas perpustakaan yang mengikat proyek Anda dengan rencana waktunya sendiri. Menulis ulang satu algoritma yang dapat Anda lakukan dengan perencanaan waktu Anda sendiri, tidak bergantung pada keputusan orang lain.
Jika Anda sendirian dan suka mendistribusikan ada masalah lain. Saya menganggap serta banyak kode sumber lainnya sebagai sumber daya paling berguna. Banyak untuk semua informatika mungkin setuju di sini. Dalam bidang yang diterapkan di luar informatika, mungkin diperlukan untuk menyediakan exectuable yang telah dikompilasi pada windows. Di Linux Anda dapat mengatur sendiri hal-hal yang relatif mudah jika menggunakan pustaka penggunaan sumber terbuka.
Menulis ulang algoritma sendiri memberi kebebasan lisensi. Proyek Anda mungkin tidak mendukung lisensi GPL dari GSL misalnya.
Lisensi mungkin merupakan satu-satunya kendala yang tidak tergantung dari sudut pandang para peneliti.
sumber