Python, Performans, v.s. 26/03/2008, Wednesday - 19:09

Bir süre önce lab'da geliştirdiğimiz sinyal işleme ve analiz uygulamalarında ufaktan Python kullanmaya başladım. İnsanlar pek temkinli yaklaştılar bu fikre, mevzu sinyal analizi olduğunda performans çok önemli bir kriter olduğu için Python kesinlikle bir alternatif olamazdı onlara göre (ama birileri zamanında "optimize edilmiş kod yazıyorum" derken ortaya çıkmış olan ve 60-70 satırlık işi 500 satırda çözen kimsenin dokunmak istemediği C ucubeleri, hatta bütün bioinformatics dünyası kullanıyor olduğu için Perl dahi bir alternatif olabilirdi (bu kadar sinek yanılıyor olamazdı)).

Deliriyorum insanlar ezberden konuştukları zaman, orta yaş ve üzeri insanlar daha çok yapıyor. Performans elbette çok ciddi bir sorun, hele işin içine milyonlarca kez dönen döngüler, 150 boyutlu vektörler, matrisler, yoğun fonksiyon çağrıları filan girince Python, aynı işi yapan C kodundan 100-200 kat daha yavaş çalışabiliyor. Fakat bu demek değil ki Python'un performansın çok önemli olduğu bilimsel programlama dünyasında yeri yok...

Nitekim bilimsel hesaplama işlerinde Python için yazılmış (ya da Python arayüzleri hazırlanmış) olgun kütüphaneler mevcut. Bendeniz bu sıralar SciPy ile pek içli dışlı (dökümantasyon konusunda çok zayıf olsa da istediğinizi yapmanız, biraz kod okumaktan biraz Google araması yapmaktan sıkılmayacaksanız, çok da zor değil). SciPy sayesinde herhangi bir bilimsel hesaplama görevinde kullanabileceğiniz neredeyse tüm yordamlar elinizin altında olduğu gibi "bunlar bana yetmedi, benim şöyle bir şeye ihtiyacım var" dediğiniz performans kritik noktalarda derdinizi C'ye çözdürme imkanı veren weave paketine de sahip oluyorsunuz (hem "anlatmaya çalıştığım şeyi hemen anlatsın", hem de "beni çok uğraştırmasın" kısıtları sonucunda aşağıdaki işlevsiz örneği veriyor olmaktan dolayı utanç duyuyorum):

#test1.py
x, c = 10000, 0

for i in range(0, x):
for j in range(0, x):
c += 1

print c

#test2.py
from scipy.weave import converters
from scipy import weave

x = 10000

code = """
int i, j;
long c = 0;
for(i = 0; i < x; i++)
for(j = 0; j < x; j++)
c++;
return_val = c;
"""

print weave.inline(code, ['x'],
type_converters=converters.blitz,
compiler = 'gcc')

Bu arkadaşları çalıştırdığımız zaman performans farkı çok net bir şekilde görünüyor:

meren@pardus-cerm ~ $ time python test1.py
100000000

real 0m30.333s
user 0m30.203s
sys 0m0.106s
meren@pardus-cerm ~ $ time python test2.py
100000000

real 0m0.740s
user 0m0.657s
sys 0m0.036s

Yazdıkları kodun profilini inceleyip nerede neyin performansı sıkıntıya soktuğunu bulacak kadar işini bilenler için extension yazmaktan çok daha az acılı bir çözüm bence. Öte yandan extension kaçınılmazsa onun da kolayı var (önceki denemelerimden birisini buraya koydum, Python bilenler neler döndüğünü hemen anlayabilirler).

İlgilenenlere duyurulur.

PS: Bu arada mevzu Python, performans filan iken Gürer'in bir kaç saat önce bağlantısını gönderdiği bir video'yu da paylaşayım: YouTube Scalability.


Tags: geliştiriciler için  bunarı biliyor muyuz 

Comments

#1   Ömer F. USTA commented 28 March 08, Friday @ 21:43

Merhabalar

Sanırım rafb.net in zaman kısıtlaması konusu gözünüzden kaçmış. Mevcut link şu anda çalışmıyor.
http://pastebin.ca/ adresini tercih ederseniz koyduğunuz metinlerin buharlama ( :D ) süresini
belirleyebilirsiniz.

#2   A. Murat Eren commented 28 March 08, Friday @ 22:49

Hay allah.

Yoktu sanki eskiden zaman sınırlaması filan :( Bir ara güncelleyeyim. Teşekkürler.

Post a comment

Your name: Comment:
Number of remaining characters: