Python adalah bahasa yang disukai banyak programmer. Bahasa ini sangat mudah digunakan. Masalahnya adalah bahwa kode yang ditulis dengan Python intuitif dan mudah dibaca. Namun, dalam percakapan tentang Python orang sering dapat mendengar keluhan yang sama tentang bahasa ini. Terutama ketika para pakar C berbicara tentang Python. Begitulah kedengarannya: "Python lambat." Dan mereka yang berkata demikian tidak berdosa terhadap kebenaran.
Dibandingkan dengan banyak bahasa pemrograman lain, Python memang lambat.
Berikut adalah hasil pengujian yang membandingkan kinerja berbagai bahasa pemrograman dalam menyelesaikan berbagai masalah.

Ada beberapa cara untuk mempercepat program Python. Misalnya, Anda dapat menggunakan
perpustakaan yang dirancang untuk menggunakan beberapa inti prosesor. Mereka yang bekerja dengan Numpy, Pandas, atau Scikit-Learn dapat disarankan untuk melihat paket perangkat lunak
Rapids , yang memungkinkan Anda untuk menggunakan GPU dalam perhitungan ilmiah.
Semua teknik akselerasi ini bagus dalam kasus-kasus di mana tugas-tugas yang dapat diselesaikan menggunakan Python dapat diparalelkan. Sebagai contoh, ini adalah tugas untuk pemrosesan data awal atau operasi dengan matriks.
Tetapi bagaimana jika kode Anda adalah Python murni? Bagaimana jika Anda memiliki loop besar
for
yang benar-benar harus Anda gunakan, dan eksekusi yang tidak dapat diparalelkan karena fakta bahwa data yang diproses di dalamnya harus diproses secara berurutan? Apakah ada cara untuk mempercepat Python itu sendiri?
Jawaban atas pertanyaan ini diberikan oleh Cython - sebuah proyek yang Anda gunakan untuk mempercepat kode yang ditulis dengan Python.
Apa itu Cython?
Cython, pada intinya, adalah lapisan perantara antara Python dan C / C ++. Cython memungkinkan Anda untuk menulis kode Python biasa dengan beberapa modifikasi kecil, yang kemudian langsung diterjemahkan ke dalam kode C.
Satu-satunya perubahan pada kode Python adalah menambahkan informasi tentang jenisnya ke setiap variabel. Saat menulis kode Python biasa, Anda dapat mendeklarasikan variabel seperti ini:
x = 0.5
Saat menggunakan Cython saat mendeklarasikan variabel, Anda perlu menentukan tipenya:
cdef float x = 0.5
Konstruk ini memberi tahu Cython bahwa variabelnya adalah angka floating point. Dengan prinsip yang sama, variabel dideklarasikan dalam C. Menggunakan Python biasa, tipe variabel didefinisikan secara dinamis. Deklarasi tipe eksplisit yang digunakan dalam Cython adalah apa yang memungkinkan untuk mengkonversi kode Python ke kode C. Intinya adalah bahwa dalam C, deklarasi eksplisit jenis variabel diperlukan.
Instalasi Cython sangat sederhana:
pip install cython
Ketik dalam Cython
Saat menggunakan Cython, dua set tipe dapat dibedakan. Satu untuk variabel, yang kedua untuk fungsi.
Jika kita berbicara tentang variabel, maka tipe berikut tersedia untuk kita:
cdef int a, b, c
cdef char *s
cdef float x = 0.5
(angka presisi tunggal)cdef double x = 63.4
(angka presisi ganda)cdef list names
cdef dict goals_for_each_play
cdef object card_deck
Harap dicatat bahwa di sini, sebenarnya, tipe C / C ++ diperlihatkan!
Saat bekerja dengan fungsi, tipe berikut tersedia untuk kami:
def
adalah fungsi Python biasa, yang hanya dipanggil dari Python.cdef
adalah fungsi Cython yang tidak dapat dipanggil dari kode Python biasa. Fungsi semacam itu hanya dapat dipanggil dalam kode Cython.cpdef
- Fungsi yang dapat diakses dari C dan Python.
Sekarang setelah kami mengetahui jenis-jenis Python, kami akan mengambil kecepatan kode Python.
Mempercepat kode menggunakan Cython
Mari kita mulai dengan membuat tolok ukur Python. Ini akan menjadi
for
di mana faktorial suatu angka dihitung. Kode Python murni yang sesuai akan terlihat seperti ini:
def test(x): y = 1 for i in range(1, x+1): y *= i return y
Setara cython dari fungsi ini sangat mirip dengan versi aslinya. Kode yang sesuai harus ditempatkan dalam file dengan ekstensi
.pyx
. Satu-satunya perubahan yang perlu dilakukan pada kode adalah menambahkan informasi tentang jenis variabel dan fungsinya:
cpdef int test(int x): cdef int y = 1 cdef int i for i in range(1, x+1): y *= i return y
Perhatikan bahwa fungsi tersebut memiliki kata kunci
cpdef
sebelumnya. Ini memungkinkan Anda untuk memanggil fungsi ini dari Python. Selain itu, jenis ini ditugaskan untuk variabel
i
, yang memainkan peran penghitung lingkaran. Jangan lupa bahwa kita perlu mengetikkan semua variabel yang dideklarasikan dalam fungsi. Ini akan membuat kompiler C tahu tipe mana yang digunakan.
Sekarang buat
setup.py
, yang akan membantu kami mengonversi kode Cython ke kode C:
from distutils.core import setup from Cython.Build import cythonize setup(ext_modules = cythonize('run_cython.pyx'))
Mari kita kompilasi:
python setup.py build_ext --inplace
Kode C sekarang siap digunakan.
Jika Anda melihat folder di mana kode Cython berada, di sana Anda dapat menemukan semua file yang diperlukan untuk menjalankan kode C, termasuk file
run_cython.c
. Jika Anda tertarik, buka file ini dan lihat kode-C apa yang dihasilkan oleh Cython.
Sekarang Anda siap untuk menguji kode C ultrafast kami. Di bawah ini adalah kode yang digunakan untuk menguji dan membandingkan dua versi program.
import run_python import run_cython import time number = 10 start = time.time() run_python.test(number) end = time.time() py_time = end - start print("Python time = {}".format(py_time)) start = time.time() run_cython.test(number) end = time.time() cy_time = end - start print("Cython time = {}".format(cy_time)) print("Speedup = {}".format(py_time / cy_time))
Kode ini sangat sederhana. Kami mengimpor file yang diperlukan - seperti halnya file Python biasa yang diimpor, dan kemudian kami memanggil fungsi yang sesuai, melakukannya dengan cara yang sama seperti jika kami akan bekerja dengan fungsi Python biasa sepanjang waktu.
Lihatlah tabel berikut. Anda mungkin memperhatikan bahwa versi program Cython lebih cepat daripada versi Python dalam semua kasus. Semakin besar tugas, semakin besar akselerasi yang disediakan Cython.
Ringkasan
Menggunakan Cython secara signifikan dapat mempercepat hampir semua kode yang ditulis dengan Python, tanpa melakukan upaya khusus. Semakin banyak loop dalam program dan semakin banyak data yang diproses - hasil yang lebih baik dapat Anda harapkan dari Cython.
Pembaca yang budiman! Apakah Anda menggunakan Cython dalam proyek Anda?
