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