Lebih suka Python daripada C untuk Pemrograman Algoritma

16

Saya telah mempelajari sedikit algoritma dan telah melihat situs-situs seperti SPOJ.pl TopCoder dll. Saya telah melihat bahwa programmer lebih suka C atau C ++ biasanya untuk kebanyakan kontes pemrograman algoritmik.

Sekarang saya mengalami masalah akhir-akhir ini. Saya tahu sedikit C dan Python dan ketika mencoba untuk menulis kode saya lebih suka Python daripada C untuk sebagian besar algoritma. Setiap kali saya duduk untuk menulis kode dalam CI menyerah setelah sekitar 15 menit karena saya merasa terlalu rumit dan cenderung pindah ke python. Melewati matriks Pointer dan sebagainya tampaknya tidak berguna waktu terbuang sehingga saya benar-benar dapat memanfaatkan untuk berpikir tentang algoritma itu sendiri.

Sekarang saya tahu dan telah mendengar dari banyak orang bahwa C adalah bahasa yang sangat penting dan merupakan roti dan mentega dari banyak programmer di luar sana.

Yang ingin saya ketahui adalah apakah pendekatan saya ini memiliki kelemahan / konsekuensi / Kerugian dll.

Ini bukan perdebatan Python vs C; Ini pertanyaan tentang bagaimana praktik khusus ini lebih memilih python daripada C karena kemudahan penggunaan akan mempengaruhi saya atau programmer / ilmuwan komputer lain dalam jangka panjang.


Saya ingin mendengar dari orang-orang yang telah menggunakan bahasa ini di industri / dan atau untuk mengembangkan perangkat lunak / perpustakaan besar dll.

meraba-raba
sumber
topik ini tidak akan lengkap tanpa tautan ke diskusi ini lukeplant.me.uk/blog/posts/…
permeakra
11
@permeakra: Itu hanya kata-kata kasar, pada dasarnya menyatakan bahwa belajar Haskell dan Python tidak membuat Anda lebih baik dalam bahasa lain karena bahasa-bahasa lain itu payah.
Robert Harvey
Ini bukan hanya kata-kata kasar, karena berisi deskripsi bagaimana Python dan Haskell memengaruhi pikiran pengguna mereka, dan banyak komentar dari orang lain tentang topik itu. Meskipun demikian, ia tidak menggunakan c sebagai bahasa tingkat rendah, tetapi sedikit lebih banyak bahasa tingkat tinggi, tetapi idenya sama - seseorang mulai membawa gagasan dari bahasa lain menjadi bahasa yang ia pakai saat ini, membuat kode non-idiomatis . Ini mungkin hal yang baik, tetapi ...
permeakra
1
Ini adalah pendapat saya: plus.google.com/101996847784434186165/posts/7941QuL69yP
Wayne Werner
Akan menarik untuk melihat sedikit pemrograman non-algoritmik , apa pun itu.
SK-logic

Jawaban:

14

Dalam pengalaman saya, ketika orang memiliki kesulitan yang berlebihan dalam mengkodekan algoritma dalam C, itu sering karena mereka secara erat menggabungkan manajemen struktur data mereka dengan algoritma mereka alih-alih membuat abstraksi yang tepat. Misalnya, memanipulasi pointer daftar tertaut secara manual di mana saja alih-alih pembuatan push()dan pop()fungsinya. Mereka terlalu terbiasa dengan abstraksi yang diberikan kepada mereka.

Sementara masalah ini jauh lebih jelas dengan abstraksi level yang lebih rendah, kegagalan untuk mengenali kopling ketat dan membuat abstraksi yang tepat adalah masalah di level mana pun. Mempraktikkan keterampilan ini dalam C hingga Anda dapat membuat algoritma yang terlihat bersih dan mudah dibaca akan terbawa ke bahasa apa pun yang Anda gunakan.

Masalah lain yang kadang-kadang saya lihat di antara programmer python adalah kesulitan beradaptasi untuk kinerja pada skala. Memang, kinerja biasanya bukan masalah utama, tetapi cara paling pythonic untuk mengimplementasikan algoritma untuk struktur data yang relatif kecil dapat menghentikan sistem Anda ketika Anda bekerja dengan gigabyte atau lebih banyak data. Menjadi seorang programmer C yang baik membantu Anda lebih menyadari masalah-masalah semacam itu dalam bahasa apa pun.

Bisakah Anda mempelajari keterampilan itu dalam bahasa lain? Tentu, tetapi C membantu dengan membuatnya lebih jelas ketika Anda salah.

Yang sedang berkata, saya menggunakan python untuk pemrograman algoritmik ketika saya punya pilihan, meskipun saya sama nyamannya dalam C. Python memiliki fitur bahasa yang membuatnya sangat bagus untuk pemrograman semacam itu, dan perbedaan kinerja biasanya diabaikan. Saya tidak dapat berbicara mengapa programmer lain yang tahu keduanya akan memilih C. Saya membayangkan banyak dari mereka melakukannya hanya untuk memisahkan diri dari kerumunan.

Karl Bielefeldt
sumber
1
"Mereka terlalu terbiasa dengan abstraksi yang diberikan kepada mereka." Apakah ini berasumsi bahwa saya belajar python sebelum C dan karena itu saya tidak dapat beradaptasi atau sesuatu seperti itu?
meraba
10

Para peneliti yang minat utamanya bukan pada pemrograman lebih memilih bahasa tingkat yang lebih tinggi seperti Python, karena mereka dapat membuat kode solusi yang lebih mudah dalam bahasa-bahasa tersebut daripada, katakanlah, C. Python sangat cocok untuk ini karena lebih berorientasi "prototyping", itu adalah "Termasuk baterai," dan terintegrasi dengan perpustakaan numerik seperti NumPy dan SciPy.

Jika seorang peneliti membutuhkan kinerja yang lebih baik, mereka biasanya akan menyerahkan algoritma yang mereka buat dengan Python kepada Insinyur Perangkat Lunak, yang akan menemukan cara untuk mengoptimalkannya (hingga, dan termasuk, pengodean ulang dalam C).

Robert Harvey
sumber
Jadi pada dasarnya peneliti dan Insinyur Perangkat Lunak memiliki hubungan desainer Kerajinan-man? Dan bagaimana dengan pemanfaatan kedua jenis orang tersebut di industri?
main
9
Saya pikir takeaway adalah bahwa pengkodean algoritma dengan Python, dan kemudian menulis implementasi yang lebih halus dalam C, adalah skenario yang dapat diterima.
Robert Harvey
atau "pengodean ulang dalam Cython"?
endolith
10

Ingatlah SPOJ.pl, kompetisi ACM dan semua kompetisi serupa difokuskan untuk menghasilkan kode kerja cepat yang akan dibuang segera setelah kompetisi. TopCoder melakukan ini, tetapi pada tingkat yang lebih kecil (kode setidaknya ada diatur dengan baik di tingkat desain OO).

Namun, di dunia nyata pemrograman hampir setiap jalan pintas yang Anda ambil dalam kompetisi pemrograman algoritmik adalah anti-pola. Hanya jika Anda mempertimbangkan hal ini, Anda dapat membuat perbandingan apa pun. Mari kita ambil contoh Anda: melewatkan array multidimensi antara berbagai fungsi. Dalam lingkungan kompetisi, pendekatan terbaik adalah dengan mendeklarasikan array global untuk menghemat waktu dengan mencari rincian panggilan yang tepat (misalnya apakah saya harus melewati ukuran, atau dapatkah ditentukan?). Dalam pemrograman kehidupan nyata, saya akan melakukan yang sebaliknya.

Jadi, untuk pertanyaan Anda, apakah ada konsekuensi kompleks memilih Python daripada C untuk algoritma, saya akan mengatakan tidak. Jika Anda hanya tertarik pada algoritme, Anda akan melakukan hal yang sama dengan Python dan C. Menerapkannya dalam bahasa fungsional mungkin membawa beberapa perbedaan, tetapi algoritmenya tetap sama.

Sebenarnya satu-satunya hal yang Anda peroleh dengan mengimplementasikan algoritma di C adalah kontrol lebih besar atas eksekusi dan jaminan Anda hanya menggunakan abstraksi tingkat rendah. Ini bukan hal kecil, karena dalam Python banyak kerumitan yang disembunyikan. Tetapi jika masalahnya tidak sepele dalam abstraksi tingkat yang lebih tinggi, maka Anda hanya mungkin kehilangan kecepatan eksekusi, dan dalam kebanyakan kasus, Anda tidak benar-benar mencoba membuat program secepat mungkin, Anda hanya belajar .

Seperti yang sudah disarankan, Anda selalu dapat menukar implementasi Python dengan implementasi C jika Python ternyata terlalu lambat. Tapi ini akan terjadi mungkin 2-3 kali dalam proyek besar, jadi memulai di C mungkin membuang-buang waktu, kecuali itu bahasa pilihan Anda (dan Anda telah mengindikasikan tidak).

K.Steff
sumber
1
Jika seseorang menulis aplikasi intensif matematika nyata, hampir pasti akan memilih C atau C ++ (tidak ada yang namanya 'C / C ++') karena peningkatan kinerja yang sangat besar dibandingkan bahasa yang ditafsirkan. Saya melihat Topcoder beberapa tahun yang lalu, dan saya ingat melihat banyak C ++ yang hanya membocorkan memori, karena kontes tidak peduli tentang detail kecil seperti kebocoran. Saya tidak terkesan.
Jim In Texas
Tepatnya maksud saya. Ini masalah prioritas: topcoder tidak peduli dengan kebocoran memori, karena kernel tetap akan membersihkannya setelah itu; mereka tidak peduli dengan praktik buruk atau anti-pola, jika mereka menghemat waktu.
K.Steff
2
Paragraf terakhir Anda mewujudkan aturan emas: "buat itu bekerja, lalu buatlah cepat".
Carson63000
9

Sebagai anggota lama dari TopCoder dan pengguna SPOJ sesekali, saya dapat memberi tahu Anda bahwa alasan utama untuk lebih memilih C / C ++ daripada bahasa lain di kompetisi adalah kecepatannya. Ketika eksekusi program Anda diatur waktunya, ada tekanan besar untuk memilih bahasa "tercepat" yang bisa Anda dapatkan, karena itu memberi Anda lebih banyak kendur dalam hal pengkodean algoritma Anda. Kemajuan saya di TC berubah dari Java ke C # ke C ++.

Namun, situasi ini lebih umum di kompetisi daripada dalam pengembangan sehari-hari: walaupun menulis kode optimal secara universal penting, pentingnya relatif menyelesaikan kode Anda sesegera mungkin dan menjadikannya dapat dipertahankan sebisa mungkin biasanya mengalahkan beberapa seratus siklus CPU. Jika Anda lebih nyaman mengkodekan sesuatu dengan Python, ini seringkali merupakan solusi yang lebih disukai.

Selain itu, Python menawarkan kemampuan tingkat tinggi yang tidak tersedia di C ++. Membangunnya sering kali sangat mahal, dan kadang-kadang bahkan tidak mungkin (misalnya, pertimbangkan membangun refleksi atau kode modifikasi diri dalam C ++). Dalam kasus seperti itu mengandalkan bahasa tingkat yang lebih tinggi dapat terbukti menjadi solusi yang optimal juga.

dasblinkenlight
sumber
Karena Anda adalah pengguna TC dan SPOJ. Apakah pertukaran antara waktu dan kesederhanaan sangat besar jika kita menggunakan python untuk kode? Yaitu apakah mungkin untuk membuat pengiriman sukses menggunakan python jika algoritma yang sama dapat berhasil dikirim menggunakan C? (Ya saya tahu itu akan / mungkin sangat bervariasi dari pertanyaan ke pertanyaan tetapi apakah akan ada keuntungan dalam kebanyakan kasus atau hanya beberapa?)
ffledgling
@ Ayos Saya tidak dapat berbicara untuk Python karena saya tidak pernah menggunakannya dalam konteks TC atau SPOJ, tetapi keuntungan dari C ++ daripada C # dan Java hanya sesekali penting, dan meskipun begitu itu tidak terlalu signifikan. Saya hanya dapat mengingat satu kasus ketika port langsung dari algoritma yang telah dikodekan dalam C ++ ke C # telah gagal dengan batas waktu, tetapi berada di ruang latihan. Sebagian besar waktu, menemukan algoritma yang benar adalah satu-satunya hal yang membuat perbedaan antara pengiriman yang berhasil dan yang gagal.
dasblinkenlight
1
Perhatikan bahwa bahasa yang ditafsirkan seperti Python, Ruby dan Perl berjalan beberapa kali lebih lambat daripada bahasa tingkat tinggi yang dikompilasi seperti Java dan C # (yang sendiri lambat dibandingkan dengan C). Pada akhirnya, itu tidak terlalu penting kecuali Anda berencana untuk bekerja dengan set data yang sangat besar, atau membutuhkan kecepatan waktu nyata.
KChaloux
5

Setiap kali saya duduk untuk menulis kode dalam CI menyerah setelah sekitar 15 menit karena saya merasa terlalu rumit dan cenderung pindah ke python.

Keuntungan produktivitas ini adalah alasan umum bahwa pekerjaan C dan C ++ telah menurun secara substansial.

Ini pertanyaan tentang bagaimana praktik khusus ini lebih memilih python daripada C karena kemudahan penggunaan akan mempengaruhi saya atau programmer / ilmuwan komputer lain dalam jangka panjang.

Ada dua bagian inti untuk ini. Yang pertama adalah pemrograman algortihmic. Tidak masalah bahasa apa yang Anda gunakan untuk mengekspresikan algoritma. Bekerja dengan algoritme itu sendiri dan menyesuaikan yang benar ke dalam masalah yang tepat adalah bagian-bagian penting, jadi tidak ada masalah nyata di sana.

Bagian kedua adalah peningkatan produktivitas. Menggunakan hal-hal yang membuat Anda lebih produktif dari waktu ke waktu adalah kebiasaan yang baik, dan sesuatu yang tidak akan bermanfaat bagi Anda selama karier Anda. Mampu mengekspresikan algoritme dalam berbagai bahasa sangat membantu, tetapi membantu itu lebih banyak mengenai idiom apa yang digunakan bahasa tidak harus seperti apa bahasa itu.

Singkatnya, jangan khawatir tentang itu . Apa yang Anda gunakan untuk mengekspresikan algoritme jauh kurang penting daripada bisa mengekspresikannya sama sekali.

Telastyn
sumber
3
"Pekerjaan C dan C ++ menurun secara substansial". Hah? Ini tampaknya diambil tiba-tiba, karena saya melihat tren yang berlawanan. -1 hingga Anda dapat menyatakan sumber untuk pernyataan itu.
3

Keuntungan menggunakan bahasa tingkat tinggi seperti Python atau Ruby adalah bahwa (1) sintaks mereka sangat dekat dengan pseudocode dan (2) perpustakaan standar mereka menyediakan struktur data yang berguna di luar kotak (baterai termasuk konsep yang disebutkan oleh @Robert). Jadi tidak apa-apa untuk lebih suka menggunakannya. Gunakan apa pun yang memaksimalkan produktivitas Anda, alih-alih memilih bahasa hanya karena itu mainstream atau "keren".

sakisk
sumber
Apakah Anda seorang hipster atau apa? Ini PBR Anda. Saya? Saya lebih suka menjadi keren.
Thomas Eding
2

Apa yang akan Anda lewatkan saat memprogram dalam bahasa tingkat "lebih tinggi" daripada C / C ++ adalah mempelajari cara kerja komputer. Anda tidak akan dapat mengembangkan hal-hal seperti sistem tertanam, sistem operasi dan driver perangkat keras. Mengetahui C juga membantu saat belajar assembler.

Juga, sebagian besar dari semua sistem misi kritis masih dikembangkan di C, sehingga Anda mungkin tidak dapat bekerja di beberapa cabang perangkat lunak perangkat lunak (aerospace / otomotif / med-tech dll) tanpa menyadarinya.


sumber
Pertanyaannya secara eksplisit tentang algoritma, bukan tentang aspek yang dekat dengan logam.
Konrad Rudolph
@KonradRudolph Baiklah, tetapi menulis driver perangkat keras paling sering sangat erat kaitannya dengan algoritma. Misalnya, ketika menulis driver untuk konverter analog-ke-digital, Anda harus mengembangkan filter digital dan mungkin juga semacam sistem antrian atau prioritas. Dan kemudian API di atas driver Anda. Ini sangat mirip dengan menulis "objek" atau "tipe data abstrak".
@Lundin Terima kasih telah menyebutkan kerugian dalam skenario dunia nyata.
ffledgling
1

Jika pertanyaan terus mengenai 'notasi O Besar' dan Anda mencoba dan mengukurnya, maka itu bisa lebih sulit dilakukan dengan Python kecuali Anda tahu lebih banyak tentang bagaimana python mengimplementasikan sesuatu, misalnya daftar Python bukan daftar yang ditautkan ; Semacam ular adalah TimSort; Sampah Python mengumpulkan pada waktu-waktu tertentu ...

Saya selalu merasa lebih mudah untuk menghubungkan program C ke apa yang mungkin terjadi pada prosesor, tetapi bahkan di sini, ada cache prosesor; mengiris waktu OS; Optimalisasi kompiler dll yang dapat memengaruhi intuisi saya.

Saya merasa lebih cepat untuk menulis dan men-debug kode Python jadi, ketika diberi pilihan, saya akan menulis pertama dengan Python berkonsentrasi untuk mendapatkan sesuatu yang berfungsi. Dengan program Python yang berfungsi ini, Anda sering dapat memasukkannya ke dalam sistem yang lebih besar dan mengetahui tidak hanya itu berfungsi tetapi juga apakah itu cukup cepat atau dalam aspek apa lambat. Mendapatkan beberapa data kinerja nyata kemudian membantu ketika Anda mengoptimalkan kecepatan dan memungkinkan Anda untuk menguji versi Python terhadap penulisan ulang nanti di Python atau C atau apa pun.

Jadi kekurangan untuk menggunakan hanya Python adalah bahwa bisa sulit untuk menuai manfaat dari algoritma yang ditulis mengharapkan beberapa kompilasi seperti C untuk model prosesor. Kerugian menggunakan hanya C adalah seperti yang telah Anda nyatakan: Ini babi untuk menulis dan debug dan Anda akhirnya harus menulis perpustakaan Anda sendiri terlalu sering.

Saya pikir akan lebih baik untuk menggunakan keduanya (dan bahasa lainnya), sampai Anda merasakan manfaatnya. Saya sendiri adalah seorang programmer C yang baik tetapi sekarang menulis sangat sedikit kode C asli, meskipun saya masih harus membaca (dan kadang-kadang men-debug) kode C dalam pekerjaan saya. Meskipun saya lebih suka Python, saya tahu dan masih menggunakan Perl dan Awk (dan sed dan grep dan urutkan dan Tcl dan C dan ...).

Paddy3118
sumber
Saya tidak setuju dengan paragraf pertama. Python memiliki penekanan kuat pada struktur data dan secara jelas mendokumentasikan bagaimana struktur data yang telah ditetapkan diimplementasikan. Tentu saja, pengumpulan sampah akan memiringkan runtimes, tetapi jarang akan memiringkan urutan besar-O.
Konrad Rudolph
1

Saya akan menyarankan Anda melihat Scala atau Clojure (tetapi gunakan anotasi jenis). Dalam beberapa kasus mereka bisa secepat C, dalam kasus lain mereka masih jauh lebih cepat daripada Ruby / Python, sambil memiliki sangat consice dan notasi yang jelas tidak seperti C ( IMHO ). Pertimbangkan ini vs kode C:

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

Juga mereka memiliki fungsi gudang pemrograman yang mirip dengan Ruby / Python map, filter, reducedll yang tidak secepat atau iterasi ekor panggilan rekursi, namun masih jauh lebih cepat maka bahasa scripting yang dinamis penuh.

defhlt
sumber
1

Saya ingin mendengar dari orang-orang yang telah menggunakan bahasa ini di industri / dan atau untuk mengembangkan perangkat lunak / perpustakaan besar dll.

Saya telah mengerjakan sebagian kecil dari pustaka C ++ besar selama beberapa tahun, dan telah menulis tesis sarjana dan master saya dalam konteks pustaka ini. Perpustakaan, kebetulan, adalah perpustakaan untuk algoritma bioinformatika dan struktur data.

Perpustakaan dibangun di C ++ karena C ++ hampir sempurna untuk persyaratan spesifik perpustakaan ini, dan untuk perpustakaan algoritma pada umumnya. Jika saya mengembangkan perpustakaan algoritma lain dan pilihan bahasa adalah milik saya, saya hampir pasti akan memilih C ++ lagi.

Alasannya bukan hanya kinerja tetapi juga sistem tipe kuat yang pertama-tama memberi Anda lebih banyak keamanan jenis dan kedua memberikan Anda kemampuan untuk membiarkan jenis Anda mendokumentasikan algoritma yang digunakan. Ini bisa (dalam pengalaman saya) sangat meningkatkan keterbacaan dan pemeliharaan.

Yang mengatakan, untuk coretan dan teka-teki algoritmik sederhana, saya hampir selalu menggunakan Python (terutama karena ya, bunyinya hampir seperti kode pseudo), kecuali saya secara khusus ingin mencoba cara terbaik untuk merumuskan masalah dalam C ++. Sejauh ini, saya belum menyelesaikan banyak masalah SPOJ atau TopCoder, jadi saya tidak tahu apakah kinerja benar-benar sangat penting sehingga menggunakan bahasa cepat sangat penting.

Tapi biasanya yang terpenting adalah mendapatkan algoritma yang benar agar bisa lulus. Dalam kasus tersebut, Python berfungsi dengan baik. Misalnya, untuk masalah Project Euler (yang tidak diberi batas waktu, hanya solusi yang tepat yang diperhitungkan), Python sangat cocok.

Konrad Rudolph
sumber