Profil Oluşturma Araçlarıyla Python Kodunuzu Nasıl Optimize Edebilirsiniz?

Profil Olusturma Araclariyla Python Kodunuzu Nasil Optimize Edebilirsiniz



Python kod performansını artırmak geliştiriciler için değerli bir beceridir. Profil oluşturma araçları bu durumda çok önemlidir ve kod kısıtlamalarının ve verimsizliklerin tespitini kolaylaştırır. Bu makale, Python programlarını geliştirmek için profil oluşturma araçlarını kullanmanın yollarını incelemektedir. Yürütme sürelerinin, bellek tüketiminin ve frekansların işlev çağrılarının ölçümünde uzmanlaşarak, tam olarak iyileştirme yapabiliriz.

Python Kodunu Profil Oluşturma Araçlarıyla Optimize Etme

Python kodunu profil oluşturma araçlarıyla optimize etmek için çalışmak üzere Google Colab'ı kurarken, bir Google Colab ortamı kurarak başlıyoruz. Colab'ta yeniyseniz, Jupyter not defterlerine ve çeşitli Python kitaplıklarına erişim sağlayan önemli, güçlü bir bulut tabanlı platformdur. Colab'a (https://colab.research.google.com/) adresini ziyaret ederek ve yeni bir Python not defteri oluşturarak erişiyoruz.

Profil Oluşturma Kitaplıklarını İçe Aktarma

Optimizasyonumuz profil oluşturma kitaplıklarının yetkin kullanımına dayanır. Bu bağlamda iki önemli kütüphane cProfile ve line_profiler'dır.







içe aktarmak cProfil

içe aktarmak line_profiler

'cProfile' kitaplığı, kodun profilini oluşturmaya yönelik yerleşik bir Python aracıdır; 'line_profiler' ise kodu satır satır analiz ederek daha da derinlere inmemize olanak tanıyan harici bir pakettir.



Bu adımda, özyinelemeli bir fonksiyon kullanarak Fibonacci dizisini hesaplamak için örnek bir Python betiği oluşturuyoruz. Bu süreci daha derinlemesine analiz edelim. Fibonacci dizisi, her ardışık sayının kendisinden önceki iki sayının toplamı olduğu bir sayı dizisidir. Genellikle 0 ve 1 ile başlar, dolayısıyla dizi 0, 1, 1, 2, 3, 5, 8, 13, 21 vb. gibi görünür. Özyinelemeli doğası nedeniyle programlamada yaygın olarak örnek olarak kullanılan matematiksel bir dizidir.



Rekürsif Fibonacci fonksiyonunda “Fibonacci” adında bir Python fonksiyonu tanımlıyoruz. Bu fonksiyon, argüman olarak Fibonacci dizisindeki hesaplamak istediğimiz konumu temsil eden bir “n” tamsayısını alır. Fibonacci dizisindeki beşinci sayıyı bulmak istiyoruz, örneğin “n” 5'e eşitse.





kesinlikle fibonacci ( N ) :

Daha sonra bir temel durum oluşturuyoruz. Özyinelemedeki temel durum, çağrıları sonlandıran ve önceden belirlenmiş bir değeri döndüren bir senaryodur. Fibonacci dizisinde “n” 0 veya 1 olduğunda sonucu zaten biliyoruz. 0. ve 1. Fibonacci sayıları sırasıyla 0 ve 1'dir.

eğer N <= 1 :

geri dönmek N

Bu 'if' ifadesi, 'n'nin 1'den küçük veya ona eşit olup olmadığını belirler. Eğer öyleyse, daha fazla yinelemeye gerek olmadığından 'n'nin kendisini döndürürüz.



Özyinelemeli Hesaplama

Eğer “n” 1’i geçerse özyinelemeli hesaplamaya devam ederiz. Bu durumda “(n-1)”inci ve “(n-2)”inci Fibonacci sayılarını toplayarak “n”inci Fibonacci sayısını bulmamız gerekiyor. Bunu fonksiyon içinde iki özyinelemeli çağrı yaparak başarıyoruz.

başka :

geri dönmek fibonacci ( N - 1 ) + fibonacci ( N - 2 )

Burada “fibonacci(n – 1)”, “(n-1)”. Fibonacci sayısını, “fibonacci(n – 2)” ise “(n-2)”. Fibonacci sayısını hesaplar. “n” konumunda istenilen Fibonacci sayısını elde etmek için bu iki değeri toplarız.

Özetle, bu 'fibonacci' işlevi, sorunu daha küçük alt problemlere bölerek Fibonacci sayılarını yinelemeli olarak hesaplar. Temel durumlara (0 veya 1) ulaşana kadar yinelemeli çağrılar yapar ve bilinen değerleri döndürür. Diğer herhangi bir 'n' için, '(n-1)' ve '(n-2)' için iki yinelemeli çağrının sonuçlarını toplayarak Fibonacci sayısını hesaplar.

Bu uygulama Fibonacci sayılarını hesaplamak için basit olsa da en verimli uygulama değildir. Sonraki adımlarda, daha iyi yürütme süreleri için performans kısıtlamalarını belirlemek ve optimize etmek amacıyla profil oluşturma araçlarını kullanacağız.

CProfile ile Kodun Profilini Oluşturma

Şimdi “cProfile”ı kullanarak “fibonacci” fonksiyonumuzun profilini çıkarıyoruz. Bu profil oluşturma alıştırması, her işlev çağrısının harcadığı süreye ilişkin bilgiler sağlar.

cprofiler = cProfil. Profil ( )

cprofiler. olanak vermek ( )

sonuç = fibonacci ( 30 )

cprofiler. devre dışı bırakmak ( )

cprofiler. baskı_stats ( düzenlemek = 'Kümülatif' )

Bu segmentte bir “cProfile” nesnesi başlatıyoruz, profil oluşturmayı aktif hale getiriyoruz, “n=30” ile “fibonacci” fonksiyonunu talep ediyoruz, profillemeyi devre dışı bırakıyoruz ve kümülatif zamana göre sıralanmış istatistikleri görüntülüyoruz. Bu ilk profil oluşturma bize hangi işlevlerin en çok zaman harcadığına dair üst düzey bir genel bakış sunar.

! pip kurulumu line_profiler

içe aktarmak cProfil

içe aktarmak line_profiler

kesinlikle fibonacci ( N ) :

eğer N <= 1 :

geri dönmek N

başka :

geri dönmek fibonacci ( N - 1 ) + fibonacci ( N - 2 )

cprofiler = cProfil. Profil ( )

cprofiler. olanak vermek ( )

sonuç = fibonacci ( 30 )

cprofiler. devre dışı bırakmak ( )

cprofiler. baskı_stats ( düzenlemek = 'Kümülatif' )

Daha ayrıntılı bir analiz için kodun satır satır profilini line_profiler ile çıkarmak amacıyla, kodumuzu satır satır bölümlere ayırmak için “line_profiler”ı kullanırız. “line_profiler”ı kullanmadan önce paketi Colab deposuna kurmamız gerekiyor.

! pip kurulumu line_profiler

Artık “line_profiler” hazır olduğuna göre onu “fibonacci” fonksiyonumuza uygulayabiliriz:

%load_ext line_profiler

kesinlikle fibonacci ( N ) :

eğer N <= 1 :

geri dönmek N

başka :

geri dönmek fibonacci ( N - 1 ) + fibonacci ( N - 2 )

%lprun -f fibonacci fibonacci ( 30 )

Bu kod parçası 'line_profiler' uzantısını yükleyerek başlar, 'fibonacci' fonksiyonumuzu tanımlar ve son olarak 'fibonacci' fonksiyonunun profilini 'n=30' ile çıkarmak için '%lprun'u kullanır. Kodumuzun kaynaklarını nereye harcadığını tam olarak belirleyerek yürütme sürelerinin satır satır bölümlendirilmesini sunar.

Sonuçları analiz etmek için profil oluşturma araçlarını çalıştırdıktan sonra, kodumuzun performans özelliklerini gösteren bir dizi istatistik sunulacaktır. Bu istatistikler, her işlevde harcanan toplam süreyi ve her kod satırının süresini içerir. Örneğin, Fibonacci fonksiyonunun aynı değerleri birden çok kez yeniden hesaplamak için biraz daha fazla zaman harcadığını fark edebiliriz. Bu, gereksiz hesaplamadır ve optimizasyonun, not alma yoluyla veya yinelemeli algoritmalar kullanılarak uygulanabileceği açık bir alandır.

Şimdi Fibonacci fonksiyonumuzda potansiyel bir optimizasyon tespit ettiğimiz yerde optimizasyon yapıyoruz. İşlevin aynı Fibonacci sayılarını birden çok kez yeniden hesapladığını, bunun da gereksiz fazlalığa ve daha yavaş yürütme süresine yol açtığını fark ettik.

Bunu optimize etmek için notlandırmayı uyguluyoruz. Notlandırma, önceden hesaplanan sonuçların (bu durumda Fibonacci sayıları) saklanmasını ve gerektiğinde yeniden hesaplamak yerine yeniden kullanılmasını içeren bir optimizasyon tekniğidir. Bu, gereksiz hesaplamaları azaltır ve özellikle Fibonacci dizisi gibi özyinelemeli işlevler için performansı artırır.

Notlandırmayı Fibonacci fonksiyonumuzda uygulamak için aşağıdaki kodu yazıyoruz:

# Hesaplanan Fibonacci sayılarını saklamak için sözlük
fib_cache = { }
kesinlikle fibonacci ( N ) :
eğer N <= 1 :
geri dönmek N
# Sonucun zaten önbelleğe alınmış olup olmadığını kontrol edin
eğer N içinde fib_cache:
geri dönmek fib_cache [ N ]
başka :
# Sonucu hesaplayın ve önbelleğe alın
fib_cache [ N ] = fibonacci ( N - 1 ) + fibonacci ( N - 2 )
geri dönmek fib_cache [ N ] ,

'Fibonacci' fonksiyonunun bu değiştirilmiş versiyonunda, önceden hesaplanan Fibonacci sayılarını depolamak için bir 'fib_cache' sözlüğü sunuyoruz. Fibonacci sayısını hesaplamadan önce önbellekte olup olmadığını kontrol ederiz. Eğer öyleyse, önbelleğe alınan sonucu döndürürüz. Her durumda, onu hesaplar, önbellekte saklar ve sonra geri veririz.

Profil Oluşturma ve Optimizasyon Tekrarı

Optimizasyonu (bizim durumumuzda notlandırma) uyguladıktan sonra, değişikliklerimizin etkisini bilmek ve kodun performansını iyileştirdiğimizden emin olmak için profil oluşturma sürecini tekrarlamak çok önemlidir.

Optimizasyon Sonrası Profil Oluşturma

Optimize edilmiş Fibonacci fonksiyonunun profilini çıkarmak için aynı profil oluşturma araçlarını, “cProfile” ve “line_profiler”ı kullanabiliriz. Yeni profil oluşturma sonuçlarını öncekilerle karşılaştırarak optimizasyonumuzun etkinliğini ölçebiliriz.

Optimize edilmiş “fibonacci” fonksiyonunun profilini “cProfile” kullanarak şu şekilde çıkarabiliriz:

cprofiler = cProfil. Profil ( )

cprofiler. olanak vermek ( )

sonuç = fibonacci ( 30 )

cprofiler. devre dışı bırakmak ( )

cprofiler. baskı_stats ( düzenlemek = 'Kümülatif' )

“line_profiler”ı kullanarak onun satır satır profilini çıkarırız:

%lprun -f fibonacci fibonacci ( 30 )

Kod:

# Hesaplanan Fibonacci sayılarını saklamak için sözlük
fib_cache = { }

kesinlikle fibonacci ( N ) :
eğer N <= 1 :
geri dönmek N
# Sonucun zaten önbelleğe alınmış olup olmadığını kontrol edin
eğer N içinde fib_cache:
geri dönmek fib_cache [ N ]
başka :
# Sonucu hesaplayın ve önbelleğe alın
fib_cache [ N ] = fibonacci ( N - 1 ) + fibonacci ( N - 2 )
geri dönmek fib_cache [ N ]
cprofiler = cProfil. Profil ( )
cprofiler. olanak vermek ( )

sonuç = fibonacci ( 30 )

cprofiler. devre dışı bırakmak ( )
cprofiler. baskı_stats ( düzenlemek = 'Kümülatif' )
%lprun -f fibonacci fibonacci ( 30 )

Optimizasyon sonrası profil oluşturma sonuçlarını analiz etmek için, özellikle büyük 'n' değerleri için yürütme süreleri önemli ölçüde azaltılacaktır. Not alma sayesinde fonksiyonun Fibonacci sayılarını yeniden hesaplamak için artık çok daha az zaman harcadığını gözlemliyoruz.

Bu adımlar optimizasyon sürecinde önemlidir. Optimizasyon, profil oluşturma işleminden elde edilen gözlemlere dayanarak kodumuzda bilinçli değişiklikler yapmayı içerirken profil oluşturmanın tekrarlanması, optimizasyonlarımızın beklenen performans iyileştirmelerini sağlamasını sağlar. Yinelemeli profil oluşturma, optimize etme ve doğrulama yoluyla Python kodumuzda daha iyi bir performans sunacak ve uygulamalarımızın kullanıcı deneyimini geliştirecek şekilde ince ayar yapabiliriz.

Çözüm

Bu makalede, Google Colab ortamındaki profil oluşturma araçlarını kullanarak Python kodunu optimize ettiğimiz örneği ele aldık. Örneği kurulumla başlattık, temel profil oluşturma kitaplıklarını içe aktardık, örnek kodları yazdık, hem 'cProfile' hem de 'line_profiler' kullanarak profilini oluşturduk, sonuçları hesapladık, optimizasyonları uyguladık ve kodun performansını yinelemeli olarak iyileştirdik.