Misalkan saya punya if
pernyataan dengan a return
. Dari perspektif efisiensi, harus saya gunakan
if(A > B):
return A+1
return A-1
atau
if(A > B):
return A+1
else:
return A-1
Haruskah saya lebih suka satu atau yang lain ketika menggunakan bahasa yang dikompilasi (C) atau yang scripted (Python)?
python
c
performance
compiler-construction
Jorge Leitao
sumber
sumber
Jawaban:
Karena
return
pernyataan tersebut mengakhiri eksekusi dari fungsi saat ini, kedua bentuk itu setara (walaupun yang kedua bisa dibilang lebih mudah dibaca daripada yang pertama).Efisiensi kedua bentuk ini sebanding, kode mesin yang mendasarinya harus melakukan lompatan jika
if
kondisinya salah.Perhatikan bahwa Python mendukung sintaks yang memungkinkan Anda untuk menggunakan hanya satu
return
pernyataan dalam kasus Anda:sumber
return (A>B)?A+1:A-1;
Namun sama sekali tidak ada keuntungan dalam kinerja dari penulisan kode seperti ini. Semua yang kami raih adalah membuat kode tersebut dikaburkan, tidak terbaca, dan dalam beberapa kasus lebih rentan terhadap promosi jenis tersirat.<
adalah praktik buruk karena-1 < 1u
menghasilkan hasil yang tidak terduga.-1 < 1u
, yang saya ragu, mereka akan dengan mudah menemukan bug. Cukup banyak orang akan menulis beberapa versi dari kode yang saya posting. Saya sudah terlalu sering melihat bug seperti itu dalam kode produksi untuk memercayai operator? Sebagai aturan umum, jika bahasa tersebut memberi Anda dua cara berbeda untuk melakukan hal yang sama, hanya gunakan salah satunya, jangan memilih salah satu dari keduanya secara acak tergantung pada suasana hati Anda.Dari panduan gaya Chromium :
Jangan gunakan yang lain setelah kembali:
sumber
if-else-return
cabang hampir tidak pernah sama (jika ya, maka Anda harus tetap melakukan refactoring; baik menggunakanswitch
konstruk atau untuk Python, menghitung dict / menggunakan callable / etc.). Oleh karena itu hampir semuaif-else-return
kasus klausa penjaga dan mereka selalu dapat diuji (mengejek ekspresi yang diuji) tanpaelse
.Mengenai gaya pengkodean:
Sebagian besar standar pengkodean tidak peduli bahasa melarang pernyataan pengembalian berulang dari satu fungsi sebagai praktik buruk.
(Meskipun secara pribadi saya akan mengatakan ada beberapa kasus di mana beberapa pernyataan kembali masuk akal: teks / parser protokol data, fungsi dengan penanganan kesalahan yang luas, dll)
Konsensus dari semua standar pengkodean industri tersebut adalah bahwa ekspresi harus ditulis sebagai:
Mengenai efisiensi:
Contoh di atas dan dua contoh dalam pertanyaan semuanya sepenuhnya setara dalam hal efisiensi. Kode mesin dalam semua kasus ini harus membandingkan A> B, kemudian bercabang dengan perhitungan A + 1 atau A-1, kemudian menyimpan hasilnya di register CPU atau di stack.
EDIT:
Sumber:
sumber
return
mana pun itu menjadi jelas adalah cara idiomatis untuk melakukannya dengan Python.Dengan kompiler yang masuk akal, Anda seharusnya tidak melihat perbedaan; mereka harus dikompilasi ke kode mesin identik karena mereka setara.
sumber
Ini adalah masalah gaya (atau preferensi) karena penerjemah tidak peduli. Secara pribadi saya akan mencoba untuk tidak membuat pernyataan akhir dari suatu fungsi yang mengembalikan nilai pada level indent selain dari basis fungsi. Yang lain dalam contoh 1 mengaburkan, jika hanya sedikit, di mana akhir fungsi.
Menurut preferensi saya menggunakan:
Karena ia mematuhi baik konvensi yang baik untuk memiliki pernyataan pengembalian tunggal sebagai pernyataan terakhir dalam fungsi (sebagaimana telah disebutkan) dan paradigma pemrograman fungsional yang baik untuk menghindari hasil-hasil antara gaya imperatif.
Untuk fungsi yang lebih kompleks, saya lebih suka memecah fungsi menjadi beberapa sub-fungsi untuk menghindari pengembalian prematur jika memungkinkan. Kalau tidak, saya kembali menggunakan variabel gaya imperatif yang disebut rval. Saya mencoba untuk tidak menggunakan banyak pernyataan pengembalian kecuali fungsinya sepele atau pernyataan kembali sebelum akhir adalah sebagai akibat dari kesalahan. Mengembalikan prematur menyoroti fakta bahwa Anda tidak dapat melanjutkan. Untuk fungsi kompleks yang dirancang untuk bercabang menjadi beberapa subfungsi saya mencoba untuk mengkodekannya sebagai pernyataan kasus (didorong oleh dict misalnya).
Beberapa poster menyebutkan kecepatan operasi. Kecepatan Jalankan adalah waktu yang kedua bagi saya karena jika Anda memerlukan kecepatan eksekusi, Python bukan bahasa terbaik untuk digunakan. Saya menggunakan Python sebagai efisiensi pengkodean (yaitu menulis kode bebas kesalahan) yang penting bagi saya.
sumber
var n = 1 if (A > B) else -1
return A+n
Saya pribadi menghindari
else
blok jika memungkinkan. Lihat Kampanye Anti-jikaJuga, mereka tidak mengenakan biaya 'ekstra' untuk saluran, Anda tahu: hal
"Sederhana lebih baik daripada kompleks" & "Keterbacaan adalah raja"
sumber
dict
s untuk menghindari perbedaan adalah ide yang sangat buruk untuk kinerja.Versi A lebih sederhana dan itu sebabnya saya akan menggunakannya.
Dan jika Anda mengaktifkan semua peringatan kompiler di Jawa Anda akan mendapatkan peringatan pada Versi kedua karena itu tidak perlu dan ternyata kompleksitas kode.
sumber
Saya tahu pertanyaan ini ditandai dengan python, tetapi ia menyebutkan bahasa yang dinamis jadi saya pikir saya harus menyebutkan bahwa di ruby pernyataan if sebenarnya memiliki tipe pengembalian sehingga Anda dapat melakukan sesuatu seperti
Atau karena ia juga memiliki pengembalian implisit
yang mengatasi masalah gaya tidak memiliki beberapa pengembalian dengan cukup baik.
sumber