Perbedaan kinerja pada sakelar alternatif dengan Python

Saya telah membaca beberapa artikel seputar alternatif pernyataan switch dengan Python. Terutama menggunakan dicts daripada banyak if dan elif. Namun tidak ada yang benar-benar menjawab pertanyaan: apakah ada yang memiliki kinerja atau efisiensi lebih baik? Saya telah membaca beberapa argumen bahwa if dan elif harus memeriksa setiap pernyataan dan menjadi tidak efisien dengan banyak if dan elif. Namun menggunakan dicts dapat mengatasi hal itu, tetapi Anda akhirnya harus membuat modul baru untuk dipanggil yang akan membatalkan peningkatan kinerja. Satu-satunya perbedaan pada akhirnya adalah keterbacaan.

Adakah yang bisa mengomentari hal ini, apakah memang ada perbedaan dalam jangka panjang? Apakah ada yang rutin menggunakan alternatif ini? Satu-satunya alasan saya bertanya adalah karena saya akan mendapatkan 30-40 elif/if dan mungkin lebih banyak lagi di masa depan. Setiap masukan dihargai. Terima kasih.


person Chuck    schedule 07.11.2009    source sumber
comment
Ada beberapa saran bagus, dengan beberapa diskusi tentang kinerja, di stackoverflow.com/questions/60208/   -  person Greg Hewgill    schedule 07.11.2009
comment
menjadi tidak efisien dengan banyak if dan elif. Anda harus memberikan beberapa bukti nyata bahwa hal ini benar-benar dapat diukur sebelum membuang waktu untuk hal ini. Selain itu, biaya pemeliharaan seringkali merupakan bagian termahal dari perangkat lunak. Optimalkan waktu programmer masa depan.   -  person S.Lott    schedule 07.11.2009
comment
Saya melakukan beberapa tes mengenai hal ini. Saya sedang menulis seorang juru bahasa dan menggunakan pernyataan if yang besar untuk eksekusi instruksi adalah salah satu dari dua hambatan utama.   -  person mdm    schedule 05.12.2010


Jawaban (6)


Kinerja dict biasanya tidak ada duanya, karena pencarian ke dict akan menjadi O(1) kecuali dalam kasus yang jarang terjadi dan praktis tidak pernah diamati (di mana kuncinya melibatkan tipe kode pengguna dengan hashing yang buruk;-). Anda tidak perlu "membuat modul baru" seperti yang Anda katakan, hanya callable yang sewenang-wenang, dan pembuatan tersebut, yang dilakukan hanya sekali untuk menyiapkan dict, tidak terlalu mahal -- selama pengoperasian, itu hanya satu pencarian dan satu panggilan, waktu kilat.

Seperti yang disarankan orang lain, cobalah timeit bereksperimen dengan beberapa tolok ukur mikro dari alternatif tersebut. Prediksi saya: dengan beberapa lusin kemungkinan dalam permainan, seperti yang Anda sebutkan, Anda akan terkejut jika mempertimbangkan apa pun kecuali dikte callable!-)

Jika Anda merasa terlalu sulit untuk menjalankan benchmark Anda sendiri dan dapat memberikan beberapa spesifikasi, saya rasa kami dapat melakukan benchmark alternatif untuk Anda, namun akan lebih bermanfaat jika Anda mencoba melakukannya sendiri sebelum meminta bantuan SO!-)

person Alex Martelli    schedule 07.11.2009

Perhatian Anda seharusnya tertuju pada keterbacaan dan pemeliharaan kode, bukan efisiensinya. Hal ini berlaku di sebagian besar skenario, dan khususnya skenario yang Anda jelaskan sekarang. Perbedaan efisiensi mungkin dapat diabaikan (Anda dapat dengan mudah memeriksanya dengan sejumlah kecil kode pembandingan), tetapi 30-40 elif adalah tanda peringatan - mungkin ada sesuatu yang dapat diabstraksikan dan membuat kode lebih mudah dibaca. Jelaskan kasus Anda, dan mungkin seseorang dapat memberikan desain yang lebih baik.

person Eli Bendersky    schedule 07.11.2009
comment
Sebenarnya bukan jawaban atas pertanyaan itu. Ada banyak aplikasi di mana percabangan multi-arah tidak dapat dihindari dan kinerjanya penting (misalnya penerjemah). - person mdm; 05.12.2010

Untuk semua pertanyaan kinerja/profil, jawaban yang tepat adalah "uji sendiri setiap kasus untuk kebutuhan spesifik Anda".

Salah satu alat hebat untuk ini adalah timeit yang dapat Anda pelajari di dokumen python.

Secara umum saya tidak melihat masalah kinerja terkait penggunaan kamus sebagai pengganti pernyataan switch bahasa lain. Dugaan saya adalah perbandingan kinerja akan bergantung pada jumlah alternatif. Siapa tahu ada titik kritis di mana yang satu menjadi lebih baik dari yang lain.

Jika Anda (atau orang lain) mengujinya, silakan kirimkan hasilnya.

person Gabriel Hurley    schedule 07.11.2009

Saat Anda menggunakan switch dalam banyak bahasa, Anda akan menggunakan dict dengan Python. Pernyataan switch, jika ditambahkan ke Python (sudah dipertimbangkan), tidak akan dapat memberikan peningkatan kinerja yang nyata.

dicts digunakan di mana-mana dengan Python. Dicts CPython adalah implementasi hashtable yang sangat efisien dan kuat. Pencariannya adalah O(1), bukan melintasi rantai elif, yaitu O(n). (Lagipula, 30-40 mungkin tidak memenuhi syarat untuk dianggap cukup besar). Saya tidak yakin apa yang Anda maksud tentang membuat modul baru untuk dipanggil, tetapi menggunakan dicts sangat terukur dan mudah.

Mengenai peningkatan kinerja sebenarnya, hal ini tidak mungkin ditangani secara efektif secara abstrak. Tulis kode Anda dengan cara yang paling mudah dan mudah dipelihara (Anda menggunakan Python forgoshsakes!) dan kemudian lihat apakah kodenya terlalu lambat. Jika ya, buatlah profil dan cari tahu bagian mana yang perlu dipercepat untuk membuat perbedaan nyata.

person Mike Graham    schedule 07.11.2009

Saya pikir dict akan mendapatkan keuntungan dibandingkan urutan alternatif pernyataan if seiring dengan bertambahnya jumlah kasus, karena pencarian kunci hanya memerlukan satu operasi hash. Sebaliknya jika Anda hanya memiliki beberapa kasus, beberapa pernyataan if lebih baik. Dict mungkin merupakan solusi yang lebih elegan untuk apa yang Anda lakukan. Apa pun yang terjadi, perbedaan kinerja tidak akan terlalu terlihat pada kasus Anda.

person L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o&#x    schedule 07.11.2009

Saya menjalankan beberapa tolok ukur (lihat di sini). Menggunakan daftar penunjuk fungsi adalah yang tercepat, jika kunci Anda berupa bilangan bulat berurutan. Untuk kasus umum: Alex Martelli benar, kamus adalah yang tercepat.

person mdm    schedule 09.12.2010