apakah mungkin untuk mengubah program Python ke C / C ++?
Saya perlu menerapkan beberapa algoritma, dan saya tidak yakin apakah kesenjangan kinerja cukup besar untuk membenarkan semua rasa sakit yang saya alami ketika melakukannya di C / C ++ (yang saya tidak pandai). Saya berpikir untuk menulis satu algoritma sederhana dan membandingkannya dengan solusi yang dikonversi. Jika itu saja secara signifikan lebih cepat daripada versi Python, maka saya tidak punya pilihan selain melakukannya di C / C ++.
c++
python
c
code-generation
CrazyFlyingCloseline
sumber
sumber
Jawaban:
Iya. Lihatlah Cython . Itu tidak hanya itu: Konversi Python ke C untuk speedups.
sumber
cdef
deklarasi dan dengan demikian memperkenalkan pengetikan statis (jika tidak, Anda hanya menyulapPyObject *
hal-hal buram ). Dan itu tidak akan pernah menjadi cukup cepat seperti biasa C karena biasanya berinteraksi dengan Python (100% atau lebih? Hanya untuk kode numerik biasa yang tidak berinteraksi dengan Python sama sekali untuk sebagian besar waktu!). Tapi selain itu, ya, itu bisa membuat Anda mempercepat devent."berinvestasi" bukanlah kata yang tepat di sini.
Membangun implementasi yang berfungsi dengan Python. Anda akan menyelesaikan ini jauh sebelum Anda menyelesaikan versi C.
Mengukur kinerja dengan profiler Python. Perbaiki masalah yang Anda temukan. Ubah struktur data dan algoritma yang diperlukan untuk benar-benar melakukan ini dengan benar. Anda akan menyelesaikan ini jauh sebelum Anda menyelesaikan versi pertama dalam C.
Jika masih terlalu lambat, terjemahkan secara manual Python yang dirancang dengan baik dan dibangun dengan hati-hati ke dalam C.
Karena cara melihat ke belakang bekerja, melakukan versi kedua dari Python yang ada (dengan tes unit yang ada, dan dengan data profil yang ada) masih akan lebih cepat daripada mencoba melakukan kode C dari awal.
Kutipan ini penting.
sumber
Shed Skin adalah "kompiler Python-ke-C ++ (terbatas)".
sumber
Baru saja menemukan alat baru ini dalam berita hacker.
Dari halaman mereka - "Nuitka adalah pengganti yang baik untuk juru bahasa Python dan mengkompilasi setiap konstruksi yang ditawarkan CPython 2.6, 2.7, 3.2 dan 3.3. Ini menerjemahkan Python ke dalam program C ++ yang kemudian menggunakan" libpython "untuk mengeksekusi dengan cara yang sama seperti CPython melakukannya, dengan cara yang sangat kompatibel. "
sumber
.exe
ekstensi pada OSX meskipun itu adalah OSX Mach-O yang dapat dieksekusi dengan normal. Terlihat seperti itu mungkin pengganti yang baik untukpyinstaller
,py2exe
,py2app
, dll--recurse-***
bendera adalah penting untuk diatur dengan benar sekalipun.Pilihan lain - untuk mengkonversi ke C ++ selain Shed Skin - adalah Pythran .
Mengutip High Performance Python oleh Micha Gorelick dan Ian Ozsvald :
sumber
Saya tahu ini adalah utas yang lebih lama tetapi saya ingin memberikan apa yang saya pikir sebagai informasi yang bermanfaat.
Saya pribadi menggunakan PyPy yang sangat mudah dipasang menggunakan pip. Saya secara bergantian menggunakan interpreter Python / PyPy, Anda tidak perlu mengubah kode Anda sama sekali dan saya telah menemukan itu kira-kira 40x lebih cepat dari penerjemah python standar (Entah Python 2x atau 3x). Saya menggunakan Edisi Komunitas pyCharm untuk mengelola kode saya dan saya menyukainya.
Saya suka menulis kode dengan python karena saya pikir itu memungkinkan Anda lebih fokus pada tugas daripada bahasa, yang merupakan nilai tambah besar bagi saya. Dan jika Anda membutuhkannya menjadi lebih cepat, Anda selalu dapat mengkompilasi ke biner untuk Windows, Linux, atau Mac (tidak lurus ke depan tetapi mungkin dengan alat lain). Dari pengalaman saya, saya mendapatkan sekitar 3,5x speedup lebih dari PyPy saat mengkompilasi, yang berarti 140x lebih cepat dari python. PyPy tersedia untuk Python 3x dan 2x kode dan sekali lagi jika Anda menggunakan IDE seperti PyCharm Anda dapat bertukar antara katakanlah PyPy, Cython, dan Python dengan sangat mudah (membutuhkan sedikit pembelajaran awal dan pengaturan meskipun).
Beberapa orang mungkin berdebat dengan saya tentang hal ini, tetapi saya menemukan PyPy lebih cepat dari Cython. Tapi mereka berdua adalah pilihan yang bagus.
Sunting: Saya ingin membuat catatan cepat lain tentang kompilasi: ketika Anda mengkompilasi, biner yang dihasilkan jauh lebih besar daripada skrip python Anda karena ia membangun semua dependensi ke dalamnya, dll. Tetapi kemudian Anda mendapatkan beberapa manfaat berbeda: kecepatan !, sekarang aplikasi akan bekerja pada mesin apa pun (tergantung pada OS mana Anda dikompilasi, jika tidak semua. lol) tanpa Python atau pustaka, itu juga mengaburkan kode Anda dan secara teknis 'produksi' siap (untuk gelar). Beberapa kompiler juga menghasilkan kode C, yang saya belum benar-benar melihat atau melihat apakah itu berguna atau hanya omong kosong. Semoga berhasil.
Semoga itu bisa membantu.
sumber
Saya menyadari bahwa jawaban pada solusi yang cukup baru tidak ada. Jika Numpy digunakan dalam kode, saya akan menyarankan untuk mencoba Pythran:
http://pythran.readthedocs.io/
Untuk fungsi yang saya coba, Pythran memberikan hasil yang sangat bagus. Fungsi yang dihasilkan adalah kode Fortran yang ditulis dengan cepat (atau hanya sedikit lebih lambat) dan sedikit lebih cepat daripada solusi Cython (yang cukup optimal).
Keuntungan dibandingkan dengan Cython adalah Anda hanya perlu menggunakan Pythran pada fungsi Python yang dioptimalkan untuk Numpy, artinya Anda tidak perlu memperluas loop dan menambahkan tipe untuk semua variabel dalam loop. Pythran membutuhkan waktu untuk menganalisis kode sehingga memahami operasi
numpy.ndarray
.Ini juga merupakan keuntungan yang sangat besar dibandingkan dengan Numba atau proyek lain berdasarkan kompilasi just-in-time yang (sepengetahuan saya), Anda harus memperluas loop agar benar-benar efisien. Dan kemudian kode dengan loop menjadi sangat sangat tidak efisien hanya menggunakan CPython dan Numpy ...
Kelemahan dari Pythran: tidak ada kelas! Tetapi karena hanya fungsi-fungsi yang benar-benar perlu dioptimalkan yang harus dikompilasi, itu tidak terlalu mengganggu.
Poin lain: Pythran mendukung paralelisme OpenMP dengan baik (dan sangat mudah). Tapi saya tidak berpikir mpi4py didukung ...
sumber
http://code.google.com/p/py2c/ terlihat seperti kemungkinan - mereka juga menyebutkan di situs mereka: Cython, Shedskin dan RPython dan mengonfirmasi bahwa mereka mengonversi kode Python ke C / C ++ murni yang jauh lebih cepat daripada C / C ++ penuh dengan panggilan Python API. Catatan: Saya belum mencobanya tetapi saya akan ..
sumber