Apakah ada perbedaan utama antara dua cuplikan kode berikut? Yang pertama memberikan nilai ke variabel dalam fungsi dan kemudian mengembalikan variabel itu. Fungsi kedua hanya mengembalikan nilai secara langsung.
Apakah Python mengubahnya menjadi bytecode yang setara? Apakah salah satunya lebih cepat?
Kasus 1 :
def func():
a = 42
return a
Kasus 2 :
def func():
return 42
python
interpreter
python-internals
Jayesh
sumber
sumber
dis.dis(..)
keduanya, Anda melihat bahwa ada perbedaan , jadi ya. Tetapi di sebagian besar aplikasi dunia nyata , biaya overhead ini dibandingkan dengan penundaan pemrosesan dalam fungsi tidak terlalu banyak.Jawaban:
Tidak, tidak .
Kompilasi ke kode byte CPython hanya diteruskan melalui pengoptimal lubang intip kecil yang dirancang untuk melakukan hanya pengoptimalan dasar (Lihat test_peepholer.py di rangkaian pengujian untuk mengetahui lebih lanjut tentang pengoptimalan ini).
Untuk melihat apa yang sebenarnya akan terjadi, gunakan
dis
* untuk melihat instruksi yang dibuat. Untuk fungsi pertama, berisi tugas:Sedangkan untuk fungsi kedua:
Dua instruksi lagi (cepat) digunakan di yang pertama:
STORE_FAST
danLOAD_FAST
. Ini membuat penyimpanan cepat dan mengambil nilai dalamfastlocals
larik bingkai eksekusi saat ini. Kemudian, dalam kedua kasus tersebut, aRETURN_VALUE
dilakukan. Jadi, yang kedua sedikit lebih cepat karena lebih sedikit perintah yang diperlukan untuk dieksekusi.Secara umum, ketahuilah bahwa compiler CPython konservatif dalam pengoptimalan yang dilakukannya. Itu tidak dan tidak mencoba menjadi secerdas kompiler lain (yang, secara umum, juga memiliki lebih banyak informasi untuk dikerjakan). Tujuan desain utama, selain benar-benar benar, adalah untuk a) membuatnya tetap sederhana dan b) secepat mungkin dalam menyusunnya sehingga Anda bahkan tidak menyadari bahwa fase kompilasi ada.
Pada akhirnya, Anda tidak perlu repot dengan masalah kecil seperti ini. Manfaat dalam kecepatan kecil, konstan dan, dikerdilkan oleh overhead yang diperkenalkan oleh fakta bahwa Python ditafsirkan.
*
dis
adalah modul Python kecil yang membongkar kode Anda, Anda dapat menggunakannya untuk melihat bytecode Python yang akan dijalankan oleh VM.Catatan: Seperti yang juga dinyatakan dalam komentar oleh @Jorn Vernee, ini khusus untuk implementasi CPython dari Python. Implementasi lain mungkin melakukan pengoptimalan yang lebih agresif jika mereka menginginkannya, CPython tidak.
sumber
Keduanya pada dasarnya sama kecuali dalam kasus pertama objek
42
hanya ditugaskan ke variabel bernamaa
atau, dengan kata lain, nama (yaitua
) merujuk ke nilai (yaitu42
). Itu tidak melakukan tugas apa pun secara teknis, dalam arti tidak pernah menyalin data apa pun.Saat
return
ing, pengikatan bernamaa
ini dikembalikan dalam kasus pertama sedangkan objek42
dikembalikan dalam kasus kedua.Untuk bacaan lebih lanjut, lihat artikel hebat ini oleh Ned Batchelder
sumber