Koş yılan koş
PyCon 2009’da verilen konuşmalardan biri “Profiling” üstüne, yani yazılan programın dinamik analizi üstüne, özellikle de hız konusunda.Bu konuyu özet geçecek olursak şöyle:
Knuth amca bize diyor ki; kodu yazarken erkenden optimizasyona girmeyin, küçücük yerleri optimize etmekle uğraşmayın, muhtemelen size gerekecek hız artışını %3 gibi bir kısmı gözden geçirerek yaparsınız, önemli olan burayı bulabilmek. Python kodlarken de bu iş için gelişmiş araçlar mevcut ve kullanımları çok kolay. Örneğin bir fonksiyonu çalıştıracak olalım ve analizini yapacak olalım. Ben bu iş için cProfile kullanıyorum (Ubuntu’da python-profiler paketi ile kolayca yüklenebilir). Fonksiyonu analiz edeceğim kodu şöyle yaptım:
import cProfile # ... başka fonksiyonlar buraya ... # # def fonksiyonum(): # ... if __name__ == "__main__": command = """fonksiyonum()""" cProfile.runctx( command, globals(), locals(), filename="sonuclar.profile" )
Bunu yapınca kod normal hali ile çalışıyor ve istatistikler sonuclar.profile isimli dosyaya yazılıyor. Bu dosyayı okumak için de runSnakeRun kullanıyorum. Komut satırında
runsnake sonuclar.profile
yazınca arayüz geliyor ve nerede ne kadar zaman harcandığı gözlemlenebiliyor.
Programın nerelerde takıldığı gayet kolay gözlemlenebiliyor. Örneğin benim fonksiyonumun toplam zamanının %62’si resim yüklemeye, %13′ü de onlara ilgin bükme (“affine warping”) uygumaya gidiyormuş. Bir resmi 0.04 gibi bir saniyede işleyebiliyorum ki bu da saniyede 25 kare eder, şu anlık pek derdim olmasa da gerçek zamanlı sayılır. Daha iyi bir bilgisayarda yapsam daha da hızlanır.
Yani, kıssadan hisse şu: düzgün analizler yapmadan boşuna takla atmaya gerek yok. Analiz sonucunda baktık ki yazılan Python kodu cidden sıkıntılı, o zaman ilk hamlede alttaki linkteki ipuçlarını kullanmak, olmuyorsa da o kısmı Cython, vb. ile yazmak gerek.
Konuyla ilgili Python performans ipuçlarını okuyabilirsiniz.
"Küçük iyileştirmelerin %97’sini unutmak gerek. Erken eniyilendirme tüm kötülüklerin anasıdır."
— D. Knuth
2 yorum
Hız konusunda değinmek istediğim bir nokta var.
Python, Perl ve PHP vb. gibi yorumluyacıya sahip olan diller olsun. Kaynak kodun yorumlanmasının, native olarak bulunan bir extension veya wrappera kıyasla yavaş olacakdır. Bu diller için ek kütüphanelerin sağlanması ve hızlarının native kod kadar sağlanması için extension olarak yazılabilir. Mesela PHP'de extension olarak kullanılan kütüphaneler iki amaca hizmet etmekdedir. Birincisi hız diğeri ise mevcut extension'nın PHP'de bulunmaması gibi. Swig (http://www.swig.org/) bu konuda işlerimizi kolaylaştırmakdadır.
@Mustafa: Kesinlikle. Biz de şu sıralar ikinci konudan sıkıntılıyız. Swig kullanarak güncel Opencv matris yapısı ile numpy matrislerini birleştirmeye çalışan bir öğrencimiz var. Yakında bu konuda daha bilgili olacağız umarım.
Önceden Cython kullanmıştım. C ile entegre etmede çok başarılı idi fakat C++ ile şablon kullanımlarında sıkıntılar yaşadım, sonra ara verdim. Ayrıca Python'ın dahilî "wrapper" yazma durumu da var gözüküyor.