Tuesday, March 8, 2011

Memanggil Code C di Python

Ketika seorang simulation coder sudah mulai meninggalkan tool matlab, maka penggunaan platform C/C++ menjadi alternatif yang cukup menjanjikan dengan tawaran kecepatan dan juga masalah opensource. Tapi masih ada kendala jika semua code dari matlab harus semua diterjemahkan ke dalam C/ C++ yaitu masalah library matlab yang sudah begitu sangat memanjakan engineer simulasi. Maka dari itu untuk melakukan proses migrasi ini akan lebih baik jika kita memanfaatkan kelebihan python sebagai jembatan antara C/C++/IT++ dengan matlab/octave.

Karena saya baru belajar mengenai hal ini (hari ini belajar bersama dengan yayan), maka saya akan mencoba sedikit share pengalaman bagaimana memanggil code C dari python. Mungkin bagi yang sudah terbiasa menggunakan python hal ini menjadi barang yang kecil, tapi meski begitu saya yakin masih banyak beberapa temen yang mungkin bisa mengambil manfaatnya.

1. Membuat code C sederhana.
misal code C-nya seperti ini :

#include
void hello(){
printf("hello, calling C from python is really easy (nek we ngerti rek..he he) \n");
}


kemudian code diatas bisa disimpan ke dalam file-name misalkan aja 'contoh.c'

2. Creating a shared library with the gnu compiler [gcc]
Shared libraries adalah libraries yang dipanggil oleh programs ketika mulai pertama kali. Shared library ini memungkinkan suatu object bisa di-share pada platform yang berbeda (misal python dan C). Untuk membuat 'object files' yang akan menjadi 'shared library' bisa menggunakan gcc -fPIC atau -fpic flag.
Berikut adalah contohnya (ketik di terminal linux):
>>> gcc -shared -fPIC contoh.c -o contoh.o
3. Loading dynamic link libraries
Untuk memanggil shared library yang sudah dibuat diatas kita bisa menggunaka 'ctypes'.
Ctypes akan meng-export 'cdll' untuk nge-load 'dynamic link libraries'.

sebagai contoh di script di python-nya bisa ditulis sebagai berikut :
>>> from ctypes import *
>>> libc = CDLL("./contoh.o")
>>> libc.hello() # hello disini pastikan sama dengan nama fungsi yang ada di code C/C++
kemudian save script python dalam top.py

4. Kemudian panggil python-nya dengan cara berikut (pastikan anda sudah menginstall python):
>>> python top.py

enjoy...

referensi
1. http://www.adp-gmbh.ch/cpp/gcc/create_lib.html
2. http://dalkescientific.com/writings/NBN/ctypes.html
3. http://docs.python.org/library/ctypes.html
4. http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html
5. http://mail.python.org/pipermail/baypiggies/2009-December/005918.html

8 comments:

  1. Mantap Fin... lalu cara memanggil fungsi matlab dari python-nya ditunggu ya!! Habis itu mix C/C++ - Matlab - Python ^^

    ReplyDelete
  2. agan agan, mungkin penggunaan octave jg perlu dipertimbangkan, selain C tentunya. Pengalaman terakhir saya pake octave updatean terbaru bisa menjalankan program saya yg notabene awalnya dirunning di MATLAB.

    Btw, mantap om fifin... !

    ReplyDelete
  3. Oiya betul! Kalo bisa coba juga python panggil fungsi di C/C++ lalu plot hasilnya dengan panggil fungsi plot-nya Octave.. lebih mantap lagi itu..

    d---0.o---b

    ReplyDelete
  4. @adegawa : super sekali masukannya bang ade, jadi memang octave mungkin juga bisa menjadi alternatif pilihan, cuma ketika kita (lebih tepatnya teh felis sih) meng-convert dari matlab ke octave ternyata kecepatannya malah 5 kali lebih lama dibanding dengan matlab :(.
    mungkin teh felis bisa menambahkan ^_^

    @yayan : betul agan yayan, kita juga bisa menggabungkan octave dan C dengan jembatan python

    ReplyDelete
  5. mantab artikelnya ...

    yup, setuju sama fifin,
    octave: kode mirip matlab (library juga lengkap), tapi waktu eksekusinya lambat
    C/C++ : kode beda dari matlab, tapi waktu eksekusinya cepet

    saya sempet coba jalanin kode yang dipakai sekarang di octave. setelah sedikit perubahan di sana sini (karena octave agak lebih rewel), akhirnya bisa jalan. sayangnya, waktu eksekusinya 5 kali lebih lama daripada matlab.

    dari pengalaman sih, masih bisa dioptimalkan lagi. misalnya fungsi isequal() sebisa mungkin diganti ==, terus pemanggilan fungsinya dikurangi, dan mungkin masih banyak lagi caranya, tapi pastinya bakal tetep jauh lebih lambat dari C++.

    supaya ada keseimbangan antara kemudahan & waktu eksekusi, sepertinya perlu cari komposisi yang pas antara octave, C++, dan integrasinya (misal python) ...

    ReplyDelete
  6. mantabs pak bos, akan segera dicoba..

    sepakat teh felis, perlu dicari komposisi yang pas antara octave, C++ dan integrasinya, karena saya juga pernah jalanin channel sounding di octave lama bgt..

    ReplyDelete
  7. share library C++/IT++ untuk communication,signal processing, dll: http://itpp.sourceforge.net/current/modules.html

    Tapi mungkin udah pada tau ya... :p

    ReplyDelete
  8. Sebagai informasi, di python kita juga bisa lakukan numerical calculation.. yaitu pakai module scipy dan numpy, bahkan python bisa nge-plot dengan plotting yang cukup complex menggunakan module matplotlib, saya sudah pernah coba dan memuaskan. (another tutorial for this python app would be appreciated ;)

    Cara nambahin module-nya tinggal:
    sudo apt-get install python-numpy python-scipy python-matplotlib

    Mengenai library DSP, di python jelas kalah jauh dari Octave/Matlab atau IT++, cuma menariknya udah ada library FFT di python ^^

    ReplyDelete