Performans Ölçümü

Öncelikle Yüksek Lisans öğrencim “Halil İbrahim Göfer”e teşekkürler. Bu bölümde Python ortamında performans ölçümünü nasıl yapacağımızı göreceğiz.

Performans ölçümü, bazı kodların performansıyla ilgili bilgilerin toplanması ve anlaşılması sürecidir. Performans ölçümleri ilgili başlıca aşağıdaki modüller bulunmaktadır.

  • timeit
  • cProfile
  • pstats
  • memory_profiler
  • line_profiler

1. Timeit

Timeit modülü ile başlayacağım. Bu modül, küçük kod parçalarının zamanını belirlememizi sağlar.

Timeit.timeit (args) çalışması, verilen kodu yürütmek için geçen süreyi temsil eden bir sonuç döndürür. Yukarıdaki örnekte, ilk argüman yürütülecek koddur ve ikinci argüman kodun kaç kez çalıştırılması gerektiğidir. Kodu birden çok kez çalıştırmak ve ortalamayı almak, tek bir seferde çalıştırılmasından daha doğru bir sonuç verir.

İlginç bir şekilde, yukarıdaki örnek aynı zamanda liste anlamalarının bir dizi değer üzerinde yineleme yapmak için jeneratör ifadeleri kullanmaktan daha hızlı olduğunu, ancak bellek tüketiminin yukarıdaki örnekte bulunmayan daha yüksek olduğunu göstermektedir.

Yukarıdaki kod parçalarını direkt timeit fonksiyonu içinde çalıştırdık. Bu kodları fonksiyonlara çevirip, timeit bölümünden fonksiyonu da çağırabiliriz.

2. CProfile & pstats

CProfile modülü bir python programının deterministik profilini sağlar. CProfile.run (func_name, output_file_name) çağrıldığında verilen işlev görüntülenir ve çıktıyı belirtilen bir dosyaya yazar. Aşağıdakiler çıktıya dahil edilir:

  • ncalls : aramaların sayısı için
  • tottime : Verilen fonksiyonda harcanan toplam süre (ve alt fonksiyonlara yapılan çağrılarda zaman hariç)
  • percall : oplam zamanın ncalls tarafından bölünme
  • cumtime : Bu ve tüm alt işlevlerde harcanan kümülatif zamandır (başlangıçtan çıkışa kadar). Bu rakam özyinelemeli işlevler için bile doğrudur
  • percall : İlkel çağrılar ile bölünmüş kümülatif zamanın bir bölümüdür
  • filename:lineno(function) : her fonksiyonun ilgili verilerini sağlar

Pstats.Stats sınıfı, profilli verileri okumak ve sonuçları gerektiği gibi biçimlendirmek için kullanılır. Aşağıdaki örnek profiller to_be_profiled () ve profil verilerini cprofile_results adlı dosyaya yazar. Pstats.Stats sınıfı daha sonra yaygın olarak kullanılan biçimlerde profil sonuçlarını biçimlendirmek için kullanılır (programdaki yorumları kontrol ediniz).

3. memory_profiler & line_profiler

Bir işlevin satırdaki hat profilini görmek için memory_profiler kullanılır. İçe aktarma, memory_profiler içe aktarma profilinden kullanılarak yapılır. Hangi işlevin bellek profili olması gerektiğini belirtmek için @profile dekoratörünü kullanın.

Zamana karşı bellek kullanımı grafiği çiziliyor. Bunun için mprofexecutable kullanacağız. Komut dosyasını çalıştırın ve bellek profili verilerini toplayın:

mprof run mem.py

Yukarıdaki komut, sonucu geçerli dizinde bir dosyada saklar. Zamana göre bellek kullanımı grafiğini çizin:

mprof plot

Yukarıdaki komut, en son oluşturulan bellek profili verilerini kullanır. Çıkış ekran görüntüsü:

Profillendirilmesi gereken işlevi belirtmek için @profile dekoratörünü kullanın. Python dosyasını doğrudan çalıştırarak script.py, @profile tanımlanmadığından bir hata atar, İşlevin satır satır profilini görmek için şunu kullanın:

kernprof -l -v line.py

Bu sorunu aşmanın ve kernprof kullanarak profil oluşturmanın yanı sıra normal bir betik olarak çalıştırmanın yolları vardır. İşte bir Stackoverflow cevabı:

Burada performans ölçüm modüllerinin kullanımını ele aldık.