Mengkonversi program Python ke kode C / C ++? [Tutup]

149

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 ++.

CrazyFlyingCloseline
sumber
32
Sebanyak Python kehilangan tolok ukur, perlu diingat bahwa perlambatan 50x atau 100x masih dapat diabaikan jika perhitungan selesai dalam beberapa detik dengan Python, dan bahkan tidak benar ketika Anda melakukan banyak I / O atau memiliki algoritma yang mengerikan. Alih-alih bertanya "seberapa lambat Python?" Anda harus bertanya "apakah Python cukup cepat?" (dan yang paling mungkin adalah, jujur) - itu juga lebih cepat daripada membandingkan atau bertanya di sini.
1
Menerapkan algoritma dalam python cukup cepat dan lurus ke depan ... Anda hanya perlu melakukannya dan kemudian memeriksa apakah itu cukup cepat. Sering kali Anda dapat mengoptimalkan algoritme untuk berjalan lebih cepat menggunakan struktur data yang berbeda (dict / set bukannya daftar ...) atau operasi yang berbeda. Bagaimanapun optimasi harus terjadi setelah Anda menerapkan konsep pertama dari algoritma dan membuat benchmark / memprofilkannya.
Bakuriu
@ Darnan: dalam kasus saya ini semua tentang waktu perhitungan. Jika varian C membutuhkan x jam lebih sedikit, maka saya akan menginvestasikan waktu itu untuk membiarkan algoritma berjalan lebih lama / lagi. Saya hanya ingin mengetahui (kira-kira) berapa banyak Python akan lebih lambat - jika hanya beberapa jam saya pasti tidak akan menggunakan bahasa yang saya tidak nyaman (Anda dapat merusak solusi terbaik untuk masalah dengan implementasi yang buruk: P).
CrazyFlyingCloseline
@ Delnan benar tentang Python mungkin cukup cepat untuk banyak hal. Bahkan ketika lebih lambat, kemudahan devleopment, pemeliharaan, dan peningkatan di masa depan adalah faktor penting untuk dipertimbangkan.
martineau
"x jam"? Seberapa besar ini? Sudahkah Anda membuat tolok ukur implementasi? Apakah Anda memiliki pengukuran? Sudahkah Anda membuat profil implementasinya? Atau apakah Anda mencoba mengoptimalkan solusi secara prematur?
S.Lott

Jawaban:

115

Iya. Lihatlah Cython . Itu tidak hanya itu: Konversi Python ke C untuk speedups.

Lennart Regebro
sumber
6
Tentu saja itu tidak akan menyelamatkan Anda dari apa pun kecuali Anda menambahkan banyak cdefdeklarasi dan dengan demikian memperkenalkan pengetikan statis (jika tidak, Anda hanya menyulap PyObject *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.
7
@ Darnan: Bahkan, itu menghemat sesuatu. Sebagian besar kode Python murni akan lebih cepat setelah dikompilasi. Tapi ya, dengan cdefs dan pengetikan statis Anda benar-benar mulai melihat perbedaan. Dan interfacing dengan Python Anda dapatkan di semua kasus di mana Anda menggunakan C dari Python.
Lennart Regebro
136

Jika varian C membutuhkan x jam lebih sedikit, maka saya akan menginvestasikan waktu itu untuk membiarkan algoritma berjalan lebih lama / lagi

"berinvestasi" bukanlah kata yang tepat di sini.

  1. Membangun implementasi yang berfungsi dengan Python. Anda akan menyelesaikan ini jauh sebelum Anda menyelesaikan versi C.

  2. 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.

  3. 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.

Aturan Thompson untuk Pembuat Teleskop Pertama Kali
Adalah lebih cepat membuat cermin empat inci dan kemudian cermin enam inci daripada membuat cermin enam inci.


Institut Bill McKeenan Wang

S.Lott
sumber
15
Terlepas dari skor yang luar biasa, saya tidak melihat bagaimana ini menjawab pertanyaan.
Audrius Meskauskas
29

Shed Skin adalah "kompiler Python-ke-C ++ (terbatas)".

singkat
sumber
3
Salah satu keunggulan Shed Skin adalah inferensi tipe : jika dimungkinkan untuk menebak tipe variabel dari aliran program, pemeriksaan tipe dinamis dihindari. Ini biasanya mengarah pada kode C ++ yang lebih pendek sehingga sebenarnya mungkin untuk membaca dan mengkompilasi ke program yang lebih cepat.
Kyss Tao
1
Ada juga Python → 11l → C ++ transpiler , yang juga merupakan kompiler Python terbatas untuk C ++, tetapi mendukung beberapa fitur Python, yang tidak didukung dengan Shed Skin (mis. Fungsi / penutupan tersarang).
tav
17

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. "

burung camar1089
sumber
Proyek ini jauh lebih matang daripada opsi serupa lainnya. Ini lucu ia menciptakan biner dengan .exeekstensi pada OSX meskipun itu adalah OSX Mach-O yang dapat dieksekusi dengan normal. Terlihat seperti itu mungkin pengganti yang baik untuk pyinstaller, py2exe, py2app, dll --recurse-***bendera adalah penting untuk diatur dengan benar sekalipun.
ccpizza
Nuitka memang hebat, tetapi kode C / C ++ yang dibuat menggunakan PyObject yang berikatan dengan implementasi kode CPython-C. Itu tidak menghasilkan kode-C idiomatik.
Make42
8

Pilihan lain - untuk mengkonversi ke C ++ selain Shed Skin - adalah Pythran .

Mengutip High Performance Python oleh Micha Gorelick dan Ian Ozsvald :

Pythran adalah kompiler Python-ke-C ++ untuk subset Python yang mencakup numpydukungan parsial . Kerjanya sedikit seperti Numba dan Cython — Anda membuat anotasi argumen fungsi, dan kemudian mengambil alih dengan anotasi jenis lebih lanjut dan spesialisasi kode. Ini mengambil keuntungan dari kemungkinan vektorisasi dan kemungkinan paralelisasi berbasis OpenMP. Ini berjalan menggunakan Python 2.7 saja.

Salah satu fitur yang sangat menarik dari Pythran adalah bahwa ia akan mencoba untuk secara otomatis menemukan peluang paralelisasi (misalnya, jika Anda menggunakan a map), dan mengubahnya menjadi kode paralel tanpa memerlukan usaha ekstra dari Anda. Anda juga dapat menentukan bagian paralel menggunakan pragma omp > arahan; dalam hal ini, rasanya sangat mirip dengan dukungan OpenMP Cython.

Di belakang layar, Pythran akan mengambil kode Python dan numpy yang normal dan berusaha mengkompilasinya secara agresif ke dalam C ++ yang sangat cepat - bahkan lebih cepat daripada hasil Cython.

Anda harus mencatat bahwa proyek ini masih muda, dan Anda mungkin menemukan bug; Anda juga harus mencatat bahwa tim pengembangan sangat ramah dan cenderung memperbaiki bug dalam hitungan jam.

anggota dewan
sumber
6

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.

jacktrader
sumber
2
Saya tahu ini adalah komentar yang lebih lama, tapi terima kasih!
kfrncs
Tidak masalah, saya senang itu berguna.
jacktrader
Perangkat lunak apa yang Anda gunakan untuk mengkompilasi dari interpretasi PyPy?
Vasyl Vaskivskyi
Tidak secara khusus PyPy, hanya skrip .py. Nuitka jika Anda ingin "C / C ++ executable's, atau C / C ++ source code" dan PyInstaller jika Anda hanya ingin executable (lebih mudah). Ada juga py2exe tetapi saya kurang berhasil dengan itu, meskipun saya yakin semuanya telah membaik. PyInstaller juga lintas platform, tidak hanya untuk Windows yang dapat dijalankan (bekerja dengan Linux, dan Mac). Nuitka unik karena saya pikir itu satu-satunya "kompiler" yang memberi Anda kembali kode sumber yang dapat Anda optimalkan secara teori. Ada beberapa yang lain seperti bbFreeze, cx_Freeze, dan py2app tapi saya belum mencobanya. Semoga berhasil!
jacktrader
1
Saya juga menemukan PyPy berjalan lebih cepat dari Cython. Dalam satu tes saya benar-benar menemukan PyPy menjadi kecepatan yang sama dengan versi C ++ dari program (semacam penyisipan).
Nv7
5

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 ...

paugier
sumber
4

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 ..

ashley
sumber
1
Tampaknya Py2C masih merupakan proyek yang belum selesai. Itu belum diperbarui dalam beberapa tahun, jadi mungkin sudah tidak aktif.
Anderson Green