Mengapa Anda mengkompilasi skrip Python? Anda dapat menjalankannya langsung dari file .py dan berfungsi dengan baik, jadi apakah ada keunggulan kinerja atau sesuatu?
Saya juga memperhatikan bahwa beberapa file dalam aplikasi saya dapat dikompilasi ke dalam .pyc sementara yang lain tidak, mengapa demikian?
python
compilation
ryeguy
sumber
sumber
import mylib.py
, Python akan mengkompilasimylib.py
sehinggaimport
pernyataan di masa depan berjalan sedikit lebih cepat. Jika nanti Anda berubahmylib.py
, maka itu akan dikompilasi ulang saat berikutnya diimpor (Python menggunakan tanggal file untuk melihat bahwa ini terjadi.)Jawaban:
Ini dikompilasi ke bytecode yang dapat digunakan banyak, jauh, lebih cepat.
Alasan beberapa file tidak dikompilasi adalah karena skrip utama, yang Anda panggil
python main.py
dikompilasi ulang setiap kali Anda menjalankan skrip. Semua skrip yang diimpor akan dikompilasi dan disimpan di disk.Penambahan penting oleh Ben Blank :
sumber
File .pyc adalah Python yang telah dikompilasi ke byte-code. Python secara otomatis menjalankan file .pyc jika menemukannya dengan nama yang sama dengan file .py yang Anda panggil.
"An Introduction to Python" mengatakan ini tentang kompilasi file Python:
Keuntungan menjalankan file .pyc adalah bahwa Python tidak harus mengeluarkan biaya kompilasi sebelum menjalankannya. Karena Python akan mengkompilasi ke byte-code sebelum menjalankan file .py, seharusnya tidak ada peningkatan kinerja selain itu.
Berapa banyak peningkatan yang bisa Anda dapatkan dari menggunakan file .pyc yang telah dikompilasi? Itu tergantung pada apa yang dilakukan skrip. Untuk skrip yang sangat singkat yang hanya mencetak "Hello World," kompilasi dapat merupakan persentase besar dari total waktu startup-dan-lari. Tetapi biaya mengkompilasi skrip relatif terhadap total run time berkurang untuk skrip yang berjalan lebih lama.
Skrip yang Anda beri nama pada baris perintah tidak pernah disimpan ke file .pyc. Hanya modul yang dimuat oleh skrip "utama" yang disimpan dengan cara itu.
sumber
Plus:
Pertama: kebingungan yang ringan dan dapat dikalahkan.
Kedua: jika kompilasi menghasilkan file yang jauh lebih kecil, Anda akan mendapatkan waktu pemuatan yang lebih cepat. Bagus untuk web.
Ketiga: Python dapat melewati langkah kompilasi. Lebih cepat pada beban awal. Bagus untuk CPU dan web.
Keempat: semakin banyak Anda berkomentar, semakin kecil file
.pyc
atau.pyo
akan dibandingkan dengan.py
file sumber .Kelima: pengguna akhir dengan hanya satu
.pyc
atau.pyo
file di tangan jauh lebih kecil kemungkinannya untuk memberi Anda bug yang disebabkan oleh perubahan yang tidak dikembalikan yang lupa untuk Anda beri tahu.Keenam: jika Anda membidik sistem tertanam, mendapatkan file ukuran yang lebih kecil untuk disematkan mungkin merupakan nilai tambah yang signifikan, dan arsitekturnya stabil sehingga kelemahannya, yang dirinci di bawah, tidak ikut berperan.
Kompilasi tingkat atas
Sangat berguna untuk mengetahui bahwa Anda dapat mengkompilasi file sumber python tingkat atas ke dalam
.pyc
file dengan cara ini:Ini menghilangkan komentar. Itu meninggalkan
docstrings
utuh. Jika Anda ingin menyingkirkannyadocstrings
juga (Anda mungkin ingin serius memikirkan mengapa Anda melakukan itu), maka kompilasi dengan cara ini sebagai gantinya ...... dan Anda akan mendapatkan
.pyo
file alih-alih.pyc
file; sama-sama dapat didistribusikan dalam hal fungsi esensial kode, tetapi lebih kecil dengan ukuran stripped-outdocstrings
(dan kurang mudah dipahami untuk pekerjaan berikutnya jika sudah layakdocstrings
di tempat pertama). Tapi lihat kekurangannya tiga, di bawah.Perhatikan bahwa python menggunakan tanggal
.py
file, jika ada, untuk memutuskan apakah harus mengeksekusi.py
file sebagai lawan dari file.pyc
atau.pyo
--- jadi edit file .py Anda, dan.pyc
atau.pyo
sudah usang dan manfaat apa pun yang Anda peroleh hilang. Anda perlu mengkompilasi ulang untuk mendapatkan.pyc
atau.pyo
manfaat kembali lagi, seperti mungkin.Kekurangan:
Pertama: Ada "cookie ajaib"
.pyc
dan.pyo
file yang menunjukkan arsitektur sistem tempat file python dikompilasi. Jika Anda mendistribusikan salah satu file ini ke lingkungan dari tipe yang berbeda, itu akan rusak. Jika Anda mendistribusikan.pyc
atau.pyo
tanpa terkait.py
untuk mengkompilasi ulang atautouch
sehingga menggantikan.pyc
atau.pyo
, pengguna akhir tidak dapat memperbaikinya, baik.Kedua: Jika
docstrings
dilewati dengan menggunakan-OO
opsi baris perintah seperti yang dijelaskan di atas, tidak ada yang bisa mendapatkan informasi itu, yang dapat membuat penggunaan kode lebih sulit (atau tidak mungkin.)Ketiga:
-OO
Opsi Python juga mengimplementasikan beberapa optimasi-O
sesuai opsi baris perintah; ini dapat menyebabkan perubahan dalam operasi. Optimalisasi yang diketahui adalah:sys.flags.optimize
= 1assert
pernyataan dilewati__debug__
= SalahKeempat: jika Anda dengan sengaja membuat skrip python Anda dapat dieksekusi dengan sesuatu sesuai urutan
#!/usr/bin/python
pada baris pertama, ini akan dihapus.pyc
dan.pyo
file serta fungsinya hilang.Kelima: agak jelas, tetapi jika Anda mengkompilasi kode Anda, tidak hanya penggunaannya dapat terpengaruh, tetapi potensi orang lain untuk belajar dari pekerjaan Anda berkurang, seringkali sangat parah.
sumber
Ada peningkatan kinerja dalam menjalankan python yang dikompilasi. Namun ketika Anda menjalankan file .py sebagai modul yang diimpor, python akan mengkompilasi dan menyimpannya, dan selama file .py tidak berubah, selalu akan menggunakan versi yang dikompilasi.
Dengan bahasa yang saling terkait saat file digunakan prosesnya terlihat seperti ini:
1. File diproses oleh interpeter.
2. File dikompilasi
3. Kode kompilasi dijalankan.
jelas dengan menggunakan kode pra-kompilasi Anda dapat menghilangkan langkah 2, ini berlaku python, PHP dan lainnya.
Berikut posting blog yang menarik menjelaskan perbedaan http://julipedia.blogspot.com/2004/07/compiled-vs-interpreted-languages.html
Dan inilah entri yang menjelaskan proses kompilasi Python http://effbot.org/zone /python-compile.htm
sumber
Seperti yang telah disebutkan, Anda bisa mendapatkan peningkatan kinerja dari kode python yang dikompilasi menjadi bytecode. Ini biasanya ditangani oleh python sendiri, hanya untuk skrip yang diimpor.
Alasan lain Anda mungkin ingin mengkompilasi kode python Anda, bisa jadi untuk melindungi kekayaan intelektual Anda agar tidak disalin dan / atau dimodifikasi.
Anda dapat membaca lebih lanjut tentang ini di dokumentasi Python .
sumber
Pasti ada perbedaan kinerja saat menjalankan skrip yang dikompilasi. Jika Anda menjalankan
.py
skrip normal , mesin mengkompilasinya setiap kali dijalankan dan ini membutuhkan waktu. Pada mesin-mesin modern ini hampir tidak terlihat tetapi ketika skrip tumbuh mungkin menjadi lebih banyak masalah.sumber
Sesuatu yang tidak tersentuh adalah kompilasi sumber-ke-sumber . Sebagai contoh,
nuitka
menerjemahkan kode Python ke C / C ++, dan mengkompilasinya ke kode biner yang langsung berjalan pada CPU, bukannya bytecode Python yang berjalan pada mesin virtual yang lebih lambat.Ini dapat menyebabkan peningkatan kecepatan yang signifikan, atau ini akan memungkinkan Anda bekerja dengan Python sementara lingkungan Anda bergantung pada kode C / C ++.
sumber
Kami menggunakan kode terkompilasi untuk mendistribusikan kepada pengguna yang tidak memiliki akses ke kode sumber. Pada dasarnya untuk menghentikan programmer yang tidak berpengalaman secara tidak sengaja mengubah sesuatu atau memperbaiki bug tanpa memberi tahu kami.
sumber
Yap, kinerja adalah alasan utama dan, sejauh yang saya tahu, satu-satunya alasan.
Jika beberapa file Anda tidak dikompilasi, mungkin Python tidak dapat menulis ke file .pyc, mungkin karena izin direktori atau sesuatu. Atau mungkin file yang belum dikompilasi tidak pernah dimuat ... (skrip / modul hanya dikompilasi saat pertama kali dimuat)
sumber
Pemula menganggap Python dikompilasi karena file .pyc. File .pyc adalah bytecode yang dikompilasi, yang kemudian ditafsirkan. Jadi jika Anda sudah menjalankan kode Python Anda sebelumnya dan memiliki file .pyc berguna, itu akan berjalan lebih cepat untuk kedua kalinya, karena tidak harus mengkompilasi ulang bytecode
penyusun: Compiler adalah bagian dari kode yang menerjemahkan bahasa tingkat tinggi ke dalam bahasa mesin
Penerjemah: Penerjemah juga mengonversi bahasa tingkat tinggi menjadi setara biner yang dapat dibaca mesin. Setiap kali ketika seorang juru bahasa mendapatkan kode bahasa tingkat tinggi untuk dieksekusi, itu mengubah kode menjadi kode perantara sebelum mengubahnya menjadi kode mesin. Setiap bagian dari kode ditafsirkan dan kemudian dieksekusi secara terpisah dalam urutan dan kesalahan ditemukan di bagian kode itu akan menghentikan interpretasi kode tanpa menerjemahkan set kode berikutnya.
Sumber: http://www.toptal.com/python/why-are-there-so-many-pythons http://www.engineersgarage.com/contribution/difference-between-compiler-and-interpreter
sumber