cProfile ve line_profiler ile Profil Oluşturma
cProfile ve satır satır profil oluşturmayla CPU darboğazlarını bulun.
cProfile ve line_profiler ile Profil Oluşturma, CoddyKit'te ücretsiz bir Python Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Python Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Python Academy kursu toplamda 4 dersten oluşur.
Neden Profil Oluşturmalısınız?
Profil oluşturma, en çok zamanı hangi işlevlerin tükettiğini belirleyerek optimizasyon çalışmalarına yön verir. Optimizasyon yapmadan önce her zaman profil oluşturun; asla tahminde bulunmayın.
import cProfile
def slow():
total = 0
for i in range(1_000_000):
total += i
return total
cProfile.run("slow()")CLI'dan cProfile Çalıştırma
Bir betiği değiştirmeden tamamını profilleyin: python -m cProfile -s cumtime script.py. cumtime, tottime veya calls'a göre sıralayın.
# python -m cProfile -s cumtime my_script.py
#
# ncalls tottime percall cumtime percall filename:lineno(function)
# 1000 0.500 0.001 2.100 0.002 utils.py:10(process)Kodda cProfile
Bir cProfile.Profile oluşturun, etkinleştirin/devre dışı bırakın, ardından pstats ile istatistikleri yazdırın.
import cProfile, pstats, io
pr = cProfile.Profile()
pr.enable()
# ... code to profile ...
pr.disable()
stream = io.StringIO()
ps = pstats.Stats(pr, stream=stream).sort_stats("cumulative")
ps.print_stats(10) # top 10
print(stream.getvalue())pstats Filtreleme
Profilleyici çıktısını print_stats(pattern) kullanarak belirli bir modüle veya işlev adı desenine göre filtreleyin.
import cProfile, pstats
cProfile.run("my_function()", "profile.out")
stats = pstats.Stats("profile.out")
stats.sort_stats("tottime")
stats.print_stats("mymodule") # only mymodule functionsline_profiler
line_profiler, yalnızca işlev başına değil, satır başına yürütme süresini de gösterir — bir işlev içindeki en yoğun satırı bulmak için gereklidir.
# pip install line_profiler
# Decorate target function:
from line_profiler import profile
@profile
def process(data):
result = []
for item in data: # <- which line is slow?
result.append(item*2)
return result
# Run: kernprof -l -v script.pykernprof CLI
kernprof -l script.py, satır profillemesi etkinleştirilmiş olarak betiği çalıştırır; -v raporu hemen görüntüler.
# kernprof -l -v script.py
#
# Line # Hits Time Per Hit % Time Line Contents
# ======================================================
# 4 1 2.0 2.0 1.0 result = []
# 5 1000 120.0 0.1 60.0 for item in data:
# 6 1000 80.0 0.1 39.0 result.append(item*2)Jupyter'da Profilleme
Jupyter, %prun (cProfile) ve %lprun (line_profiler) sihirli komutlarını sağlar.
# In a Jupyter cell:
# %prun -s cumulative my_function(data)
# %load_ext line_profiler
# %lprun -f my_function my_function(data)Darboğazları Belirleme
En yüksek birikimli süreye (tüm çağrı zinciri) ve en yüksek toplam süreye (çağrılanlar hariç yalnızca işlevin kendisi) sahip işlevlere odaklanın.
# cumtime = total time including callees (find root cause)
# tottime = time in function itself (find where work happens)
#
# Optimise the function with highest tottime firstErken Optimizasyondan Kaçınma
Önce profilleyin, ardından ölçülen darboğazı optimize edin. Yaygın Python hızlandırmaları şunlardır: yerleşik işlevleri kullanmak, döngüleri NumPy'ye taşımak, tekrarlanan aramaları önbelleğe almak veya ctypes/cffi aracılığıyla C çağırmak.
# Before optimising:
# profile shows: process_row() 95% of time
# Speedup: vectorise with NumPy
import numpy as np
arr = np.array(data)
result = arr * 2 # 100x faster than Python looppy-spy: Örneklemeli Profilleyici
py-spy, kodu değiştirmeden çalışan süreçleri profiller — canlı bir PID'ye bağlanabilirsiniz.
# pip install py-spy
# Profile for 30 s and show flamegraph:
# py-spy top --pid 12345
# py-spy record -o profile.svg --pid 12345 --duration 30timeit ile Karşılaştırmalı Ölçüm
Belirli ifadelerin mikro karşılaştırmalı ölçümleri için timeit kullanın.
import timeit
result = timeit.timeit(
"[x*2 for x in range(1000)]",
number=10_000
)
print(f"{result:.3f} s for 10k runs")Hızlı Kontrol
Bir cProfile raporunda tottime neyi gösterir?
Özet
Yavaş işlevleri bulmak için cProfile, yavaş satırı bulmak için line_profiler kullanın. Temel nedenleri bulmak için -s cumtime ile profilleyin. Yalnızca kanıtlanmış darboğazları optimize edin — en büyük kazanımlar için NumPy vektörleştirmesini, önbelleğe almayı veya C eklentilerini kullanın.
Sıkça Sorulan Sorular
“cProfile ve line_profiler ile Profil Oluşturma” dersi ücretsiz mi?
Evet — “cProfile ve line_profiler ile Profil Oluşturma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Python Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Python Academy kursu toplamda 4 dersten oluşur.
“cProfile ve line_profiler ile Profil Oluşturma” dersinde ne öğreneceğim?
cProfile ve satır satır profil oluşturmayla CPU darboğazlarını bulun. Python Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Python Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Python Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“cProfile ve line_profiler ile Profil Oluşturma” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Python Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Python Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- CPython Başvuru Sayımı
- Çöp Toplayıcı ve Döngüsel Başvurular
- cProfile ve line_profiler ile Profil Oluşturma
- tracemalloc ile Bellek Profili Oluşturma