Cython: semudah Python & secepat Java, bahkan lebih

Beberapa waktu yang lalu saya menulis sebuah artikel yang membandingkan performa 7 bahasa pemrograman ketika memproses 3 operasi dasar: “if”,”for”, & “while”.  Beberapa bahasa pemrograman seperti Matlab, PHP, R, & Python memiliki keleluasaan antara sebuah interpreter dan compiler, bahkan diantara keduanya (JIT). Artikel kali ini akan memperkenalkan Cython (compiled Python) dan melihat peningkatan performanya dibandingkan versi murni Python, JIT, dan Java.

Sebelum kita mulai, mari kita kilas balik hasil benchmark yang di dapat di artikel sebelumnya:
Gambar 1. BenchMark 7 Bahasa Pemrograman terhadap Operasi Dasar (For, While, & if).
Ada sedikit catatan kecil yang penting dari hasil tersebut, sebenarnya C++  memiliki catatan waktu <0.0001. C++ dengan optimasi -O2 sedemikian cepatnya ia benar-benar berada di kelas yang lain ketimbang bahasa pemrograman lain. C/C++ is the beast, kalau mau mengalahkan performanya mungkin hanya fortran dan assembler yang bisa ngimbangin. Tapi jaman sekarang, siapa juga yang mau mengembangkan aplikasi dengan assembler (kecuali Namco & perusahaan besar penuh dengan geek lainnya). Untuk manusia biasa seperti saya, tools yang mudah digunakan, namun memiliki performa yang mumpuni bagaikan orang Indonesia dan Nasi … pokoknya mah kudu … :)

Pendahuluan

Apa itu Cython? Apakah dia temannya iblis (red: Cython dibaca ‘syaithon’) ? … :D … Walau pronounciation cython agak mengerikan bagi orang Indonesia, namun Cython bagaikan malaikat bagi para programer. Mengapa? Bayangkan ada sebuah tools yang amat mudah untuk digunakan bagaikan bahasa pemrograman interpreter seperti Matlab, PHP, atau Python, namun memiliki performa seperti C/C++/Java.  Secara sederhana Cython adalah versi compilernya Python sebagaimana Mex bagi Matlab atau HHVM (HipHop) bagi PHP.
Menurut sejarahnya, embah buyut Cython adalah Pyrex: sebuah bahasa pemrograman yang awalnya terlahir untuk membantu user membuat modul di Python. Namun kemudian SAGE mengembangkan Pyrex ke arah yang berbeda (fork) karena melihat potensi Pyrex yang lebih luas dan menamakannya SageX. Akhirnya SageX melebur dengan project cython-lxml untuk menjadi Cython yang ada saat ini (http://cython.org/). Cython didistribusikan secara cuma-cuma dan open source, dibawah lisensi Apache (license 2.0), sehingga fleksibel tidak hanya untuk digunakan, tapi juga dikembangkan lebih lanjut.

Instalasi dan Requirements

Agar artikelnya tidak terlalu panjang, mari langsung saja kita mulai aksi. Instalasi Cython sebenarnya sangat mudah, apalagi kalau menggunakan tools seperti PIP. Seperti biasa kita cukup mengetikkan perintah berikut di Shell/terminal/command prompt: “pip install cython”  atau kalau install dari sumbernya (unduh disini), maka perintah installnya sama seperti modul python yang lain: “python setup.py install“. Bahkan jika kita menggunakan Python – Anaconda, biasanya Cython sudah terinstall sebagai bagian dari paket besar modul Python di Anaconda.
Namun demikian, karena Cython sebenarnya merubah Python menjadi C, kemudian meng-compilenya menjadi fungsi yang dapat dipanggil di program Python, maka yang harus diperhatikan adalah kita wajib memiliki compiler C di komputer kita. Bagi mereka yang belum pernah atau tidak terbiasa dengan C/C++, compiler C di Windows dan linux sedikit berbeda. Di Linux kita bisa menggunakan MinGW, sedangkan di Windows kita bisa menggunakan MinGW atau C++ dari microsoft. C++ versi microsoft ada yang gratis (SDK 3.5/4 atau visual studio versi Community Edition/Express).  Ada catatan penting yang harus diperhatikan: Perhatikan versi compiler C-nya. Jika menggunakan Python versi 3.5 di Windows sebaiknya menggunakan visual studio 2015 dan menggunakan compiler 32 bit. Jika ingin menggunakan MinGW dan/atau 64 bit silahkan baca lebih lanjut keterangan lengkapnya disini. di Artikel ini saya menggunakan Python 3.5, Cython versi 0.23.4, dan visual studio 2015.

The Cython

Kita masih akan menggunakan fungsi aneh (stupid function) yang digunakan di artikel sebelumnya (dengan sedikit perubahan untuk menambah perhitungan). Untuk menggunakan Cython kita perlu menyiapkan 3 file: [1]. Fungsi-nya: saya namakan fCython.pyx [2]. File instalasinya: setup.py [3]. File python untuk memanggil hasil cython: saya namakan Test_Cython.py. Isi ke-3 file tersebut adalah sebagai berikut: (Notes anda bisa CoPas (Copy-Paste) codenya dengan terlebih dahulu double-click di window code-nya).
fCython.pyx
setup.py
Test_Cython.py
Perhatikan fungsi “pungsi” di fCython dan “pungsi” di Test_Cython.py memiliki sedikit sekali perbedaan. Bedanya hanya deklarasi variabel (static types): int N dan cdef int i,j, selebihnya podo bin idem wal sama. Inilah nanti yang akan menjadi “nilai jual” Cython: semudah Python, secepat C/Java. Letakkan ke-3 file tersebut di folder yang sama. Misal saya asumsikan berada di “C:\temp\Python”, maka untuk meng-compile fungsi di fCython di shell/terminal/command prompt ketikkan perintah berikut:
Seperti biasa, untuk menjalankan file utama Python-nya, bisa dilakukan dengan perintah:
Catatan: Sebenarnya proses kompilasi dan Run bisa dijalankan secara lebih mudah (on the fly) lewat modul PyXimport, namun saya skip pembahasan ini untuk lain waktu.

Hasil Benchmark

Sedikit berbeda dengan artikel sebelumnya, kali ini saya akan menggunakan nilai N yang lebih besar (N=1.000.000). Mengapa? Karena untuk N yang digunakan sebelumnya: 300.000, programnya jalan terlalu cepat untuk sebuah compiler. Saya juga hanya akan membandingkan dengan Java dan JIT. Mengapa? Kalau menggunakan R, PHP, atau Matlab dengan nilai N=1.000.000 di fungsi diatas nanti nunggu programnya selesai komputernya bisa mati ketuaan duluan (kidding :D ).
ok, inilah hasil yang dinanti-nanti:
Gambar 2. Pure Python VS JIT Python VS Cython VS Java
Python murni butuh 11.722 detik (sekitar 3,5 jam!), tapi Cython hanya butuh 16 detik!!!… (Speedup >732 x). Pada percobaan sederhana ini Cython 2x lebih cepat dari JIT, dalam aplikasi nyata hal ini sangat signifikan (bayangkan proses 20 menit, lalu bisa dipercepat menjadi 10 menit). Cukup mengejutkan juga bagi saya, di test sederhana ini bahkan Cython sedikit lebih cepat dari Java.

Penutup

Baik secara eksplisit maupun implisit ada beberapa hikmah yang cukup penting dari eksperimen sederhana ini.
  • Sekilas, akhirnya semakin mengerti mengapa Youtube,  Google, Dropbox, dan beberapa aplikasi besar lain menggunakan Python. Namun, tentu saja bukan “just” python. Kemungkinan besar Python yang sudah heavily optimized.
  • Python mudah & mengasyikkan, namun di aplikasi nyatanya (production level), code murni python (pure pythonic) sebaiknya tidak digunakan. Mengapa? Perbedaan performanya dapat dilihat di hasil di atas (langit & bumi). Kecuali tentu saja untuk aplikasi dengan domain (data) dan kompleksitas yang kecil. Sehingga Big Data processing sebaiknya jangan menggunakan pure Python (apalagi bahasa pemrograman lain yang sudah ditunjukkan jauh lebih lambat di artikel/percobaan sebelumnya)
  • Menurut pendapat saya, urutan pengembangan aplikasi di lingkungan Python: simple python ==> Pythonic ==> JIT/Cython ==> MultiThread/Multi Processing. Keuntungannya? di setiap tahap, deployment sudah bisa dilakukan.
  • Hati-hati, compiled code memang mengaggumkan performanya, namun compiled code biasanya optimized untuk specific machine/komputer tertentu (Kecuali multi platform compiler seperti Java).
Semoga bermanfaat, cheers…. ^_^
< / TES >® ~ BNE 01/25/2016,20:22:11

Lampiran (code Java: Java_Test.java)

Compile Java dengan perintah: “javac Java_Test.java”
Jalankan dengan perintah : “java Java_Test”