- Bağlantıyı al
- X
- E-posta
- Diğer Uygulamalar
- Bağlantıyı al
- X
- E-posta
- Diğer Uygulamalar
Bu bölümde, Python kodunun çalışma zamanını ölçmeye ve darboğazları (bottleneck) bulmaya yarayan iki temel yerleşik modülü inceleyeceğiz: timeit ve cProfile.
timeit Modülü: Küçük Kod Bloklarını Hızla Ölçmetimeit (Time It), küçük kod parçacıklarının ne kadar hızlı çalıştığını doğru bir şekilde ölçmek için tasarlanmıştır.
Genellikle iki farklı çözüm yolu (örneğin, bir listeyi ters çevirmek için list.reverse() kullanmak mı yoksa list[::-1] kullanmak mı) arasındaki hız farkını karşılaştırmak için kullanılır.
timeit, kodunuzu otomatik olarak yüzlerce veya binlerce kez çalıştırır ve ortalama çalışma süresini verir. Bu, tek seferlik ölçümlerdeki rastgele sapmaları (diğer sistem işlemlerinden kaynaklanan) elimine eder.
import timeit
import numpy as np
# Karşılaştırılacak iki farklı yol
SETUP_CODE = 'import numpy as np; data = list(range(1000))'
# Yöntem 1: Standart Python listesi ile ters çevirme
TEST_CODE_1 = 'ters_cevirme_1 = data[::-1]'
# Yöntem 2: list.reverse() metodu (yerinde değiştirme)
#.copy() ile veri bütünlüğünü koruruz
TEST_CODE_2 = 'data.copy().reverse()'
# Testi çalıştır (1000 kez tekrarla)
zaman_1 = timeit.timeit(setup=SETUP_CODE,stmt=TEST_CODE_1,number=1000)
zaman_2 = timeit.timeit(setup=SETUP_CODE,stmt=TEST_CODE_2,number=1000)
print("--- timeit Karşılaştırması (1000 Tekrar) ---")
print(f"Yöntem 1 (Slicing [::-1]): {zaman_1:.6f} saniye")
print(f"Yöntem 2 (list.reverse()): {zaman_2:.6f} saniye")
if zaman_1 < zaman_2:
print("\nSonuç: Slicing ([::-1]) yöntemi daha hızlıdır.")
else:
print("\nSonuç: list.reverse() yöntemi daha hızlıdır.")
cProfile Modülü: Darboğaz (Bottleneck) BulmacProfile, tüm bir programın veya büyük bir fonksiyon bloğunun performansını analiz etmek için kullanılır.
Programınızın toplam çalışma süresinin en çok nerede harcandığını bulmak için kullanılır. Buna "profil çıkarma" (profiling) denir. Bu sayede, optimizasyon çabalarınızı en yavaş çalışan kısımlara (darboğazlara) odaklayabilirsiniz.
Program çalışırken, cProfile her fonksiyonun kaç kez çağrıldığını ve her çağrıda ne kadar zaman harcandığını kaydeder.
Aşağıdaki örnekte, bir programın yavaş çalışmasına sebep olan fonksiyonu (burada yavas_islem) nasıl tespit ettiğimizi görelim.
import cProfile
def yavas_islem():
"""Çok sayıda döngü içerdiği için yavaş çalışan fonksiyon."""
toplam = 0
for i in range(1000000):
toplam += i
return toplam
def hizli_islem():
"""Daha hızlı çalışan basit fonksiyon."""
return [x * 2 for x in range(10)]
def ana_program():
"""Programın ana akışı."""
hizli_islem()
yavas_islem()
hizli_islem()
print("--- cProfile Analizi ---")
# 'runcall' metodu, verilen fonksiyonu çalıştırır ve profil
# verilerini toplar.
cProfile.run('ana_program()')
cProfile Çıktı Analizi (Basitleştirilmiş):
cProfile çıktısı karmaşık görünse de, bakmanız gereken temel sütunlar şunlardır:
| Sütun | Anlamı |
| ncalls | Fonksiyonun kaç kez çağrıldığı. |
| tottime | Fonksiyonun içinde geçirilen toplam süre (başka fonksiyon çağrılmadan). Darboğazı bulmak için en önemli sütundur. |
| cumtime | Fonksiyonun ve onun çağırdığı tüm fonksiyonların içinde geçirilen toplam süre. |
Çıktı size şunu gösterecektir: yavas_islem fonksiyonunun, hizli_islem fonksiyonundan çok daha yüksek bir tottime değerine sahip olduğunu göreceksiniz. Bu, optimizasyon yapmanız gereken yerin yavas_islem olduğunu gösterir.
Yorumlar
Yorum Gönder