Kodunuzu analiz etmek ve nerede en çok veya en az verimli olduğunu keşfetmek için bu ipuçlarını kullanın.

Python'da "bunu yapmanın birden fazla yolu olduğundan", bazı görevler için belleği en verimli kullanan yaklaşımı bulmak zor olabilir. Bir bellek profili oluşturucunun yardımcı olabileceği yer burasıdır. Sızıntıları izlemenin yanı sıra, kodunuzun bellek profilini tahmin etmek, hangi kodun bellek açısından verimli olduğunu belirlemenize yardımcı olur.

Python ile bir makine öğrenimi modeli veya bir web sitesi geliştiriyor olsanız da, betikler, tek tek kod satırları veya işlevler için bellek profilini tahmin edebilirsiniz.

Tüm kod tabanınızın bellek profilini tahmin etmek, uygulamanızı önemli ölçüde yavaşlatabileceğinden pratik olmayabilir. Bunun yerine daha fazla bellek tüketiyor olabileceğinden şüphelendiğiniz işlevlerin veya yöntemlerin profilini seçerek belirlemeniz en iyisidir. Ancak bunu tüm uygulamanız için yapmak isteseniz bile, bununla başa çıkmak için yalıtılmış bir modül ayırmak isteyebilirsiniz.

instagram viewer

Python'da birçok profil oluşturma kitaplığı vardır. En popüler olanlardan bazıları memory_profiler, psutil, Tracemalloc, Ve sivilce. Bu öğretici kullanır memory_profiler Ve psutil.

Sırasında psutil bir yöntemin veya işlev yürütmesinin toplam bellek tüketimini tahmin etmek için idealdir, memory_profiler zaman içinde satır satır ve işlev düzeyi kullanım eğilimleri dahil olmak üzere daha ayrıntılı bellek kullanım bilgileri verir.

Başlamak için yükleyin memory_profiler Python sanal ortamınıza. Bu da yükler psutil.

pip kurulumu memory_profiler

Bellekteki Bir Nesnenin Boyutunu Alın

Bellek profili oluşturmaya, önce bellekte kullanmayı düşündüğünüz bir nesnenin boyutunu hesaplayarak başlayabilirsiniz.

Bu tür bir profil oluşturma, geliştirmenin başlangıcında, yani bir programda hangi nesne türünün kullanılacağını belirlemeye çalışırken faydalıdır.

Örneğin, bir görevi başarmak için hangi yöntemleri kullanacağınıza karar veremezseniz, örneğin uygun yöntem Python veri türü, kullanımınız için hangisinin daha hafif olduğunu belirlemek için her birinin boyutunu bayt olarak alabilirsiniz. dava.

bu sys.getsizeof yerleşik yöntem burada kullanışlı oluyor:

içe aktarmak sistem
Yazdır(liste boyutu: {sys.getsizeof([])} bayt")
Yazdır(f"sözlük boyutu: {sys.getsizeof (dikte)} bayt")
Yazdır(f"demet boyutu: {sys.getsizeof(())} bayt")
Yazdır(boyutu ayarla: {sys.getsizeof({})} bayt")

İşte çıktı:

Şunu da kullanabilirsiniz: sys.getsizeof Yerleşik ve özel bir işlevin bellek boyutunu karşılaştırma yöntemi.

Örneğin, şu özel uzunluk işlevini karşılaştırın: döngü için bir Python kullanır yerleşik ile len işlev:

içe aktarmak sistem

kesinliklegetLength(yinelenebilir):
saymak = 0

için Ben içinde yinelenebilir:
saymak +=1

geri dönmek saymak

Yazdır(f"Dahili uzunluk işlevi: {sys.getsizeof (uzunluk)} bayt")
Yazdır(f"Özel uzunluk işlevi: {sys.getsizeof (getLength)} bayt")

Yukarıdaki kod aşağıdaki çıktıyı verir:

Ancak, iken sys.getsizeof bir nesnenin bellekteki boyutunu ölçer, yalnızca nesnenin kendisini hesaba katar, ona referans verenleri değil. Bunun için daha ayrıntılı bir profil oluşturma yöntemine ihtiyacınız olacak.

Bir Python İşlevinin Bellek Profilini Bulun

Bir işlevin her bir kod satırının daha ayrıntılı bir bellek profilini aşağıdakini kullanarak elde edebilirsiniz: memory_profiler paket. Bu, eklemeyi içerir @profil işlevinize veya yönteminize dekoratör:

pandaları ithal et
numpy'yi içe aktar
memory_profiler içe aktarma profilinden

sınıf Manipüle:
@profil
def manipüleVeri (kendi):
df = pandalar. Veri çerçevesi({
'A' :[0, 3, numpy.nan, 10, 3, numpy.nan],
'B': [numpy.nan, "Pandalar", numpy.nan, "Pandalar", "Python", "JavaScript"],
})

df.fillna (method='bfill', inplace=True)
df.fillna (method='ffill', inplace=True)
dönüş dizisi (df)

manip = Manipüle()
yazdır (manip.manipulateData())

Yukarıdaki kod, gösterildiği gibi işlevdeki her kod satırının ayrıntılı bir bellek profilini verir:

bu bellek kullanımı sütunu, belirli bir kod satırı için bellek kullanımını gösterirken, artış sütun, her satırın katkıda bulunduğu ek yükü gösterir. bu oluşum sütun, bir kod satırının belleği ayırma veya ayırma sayısını tanımlar.

Örneğin, yukarıdaki çıktıda, satır 11, bellek kullanımını 55,4 MiB'ye çıkaran 0,1 MiB (Mebibyte) bellek artışıyla iki kez gerçekleşti. 19 ve 22. satırlar da sırasıyla 0,2 MiB ve 0,3 MiB katkıda bulunarak toplam bellek kullanımını 55,9 MiB'ye çıkardı.

Bir Python Komut Dosyasının Bellek Profilini Zaman Damgasına Göre Bulun

Ayrıca, tüm Python betiğinin bellek profilini aşağıdakileri kullanarak tahmin edebilirsiniz: memory_profiler çalıştırarak mprof gösterildiği gibi terminalde komut:

mprof script_name.py'yi çalıştırın

Yukarıdaki komut, belirtilen betiği her 0,1 saniyede bir örnekler ve otomatik olarak bir .dat mevcut proje dizininizin içindeki dosya.

takip eden rakamlar MEM gösterim, Python betiğinin belirli bir zaman aralığındaki bellek kullanım profilleridir. Sağdaki son rakamlar, profil oluşturucunun her bellek kullanımı için yakaladığı zaman damgasını temsil eder.

Ayrıca bellek profilinin bir grafiğini de alabilirsiniz. Bu, bir kurulum gerektirir matplotlib:

pip yükleme matplotlib

Kurulduktan sonra, çalıştırın mprof şöyle bir komut:

mprof grafiği

İşte bu durumda çıktı:

Komut Dosyası Bellek Profilini Özel Bir Python Dosyasında Çalıştırın

Farklı Python betikleri için profil oluşturmak isteyebilirsiniz. Bunu yapabilirsiniz özel bir Python modülü kullanarak Python aracılığıyla alt süreç.

Bu şekilde, bellek profili oluşturucunuzu kod tabanınızdan ayırabilir ve grafik çıktısını yerel olarak kaydedebilirsiniz:

içe aktarmak alt süreç

altişlem.çalıştır([
"mprof", 'koşmak', '--include-children', "eksik.py"
])

# çizim çıktısını yerel olarak kaydet
altişlem.çalıştır(["mprof", 'komplo', '--output=output.jpg'])

Komut dosyasının bellek profilini çalıştırmak için yalnızca yukarıdaki kodu içeren Python dosyasını çalıştırmanız gerekir. Bu, bir bellek profili grafiği oluşturur (çıktı.jpg) dosya dizininde:

Bir İşlev Yürütmesinden Kullanılan Bellek Miktarını Bulun

Yürütme sırasında bir yöntemin veya işlevin toplam bellek profilini aşağıdakini kullanarak bulabilirsiniz: psutil paket.

Örneğin, bir öncekinin profilini çıkarmak için Pandalar DataFrame manipülasyonu başka bir Python dosyası içindeki yöntem:

içe aktarmak psutil
içe aktarmak sistem
içe aktarmak işletim sistemi
sys.path.append (sys.path[0] + "/..")

# yönteminizi içeren sınıfı içe aktarın
itibaren bir kod.eksik içe aktarmak Manipule etmek

# sınıfı başlat
manip = Manipüle()

süreç = psutil. İşlem (os.getpid())
Initial_memory = process.memory_info().rss

# hedef yöntemi çalıştırın:
manip.manipulateData()

# yürütmeden sonra bellek bilgilerini al
final_memory = process.memory_info().rss
memory_consumed = final_memory - ilk_bellek
memory_consumed_mb = memory_consumed / (1024 * 1024)
Yazdır(f"İşlev tarafından tüketilen bellek: {memory_consumed_mb:.2F} MB")

Yukarıdakiler, yöntemin toplam bellek profilini gösterildiği gibi megabayt (MB) cinsinden tahmin eder:

Jupyter Notebook'ta Bir Kod Satırının Bellek Profilini Bulma

Jupyter Notebook'ta iPython kullanıyorsanız, tek astarlı bellek profilini kullanarak hesaplayabilirsiniz. memory_profiler. Sadece yüklemeniz gerekiyor memory_profiler bir hücrede. Sonra ekle %memit sonraki hücrelerde kodunuza sihirli işlev; bu, kodun en yüksek belleğini ve artan boyutunu döndürür.

Bu yöntem, Jupyter Notebook'ta iPython'un yanı sıra normal Python betikleriyle çalışmaz.

Örneğin:

Şunu da kullanabilirsiniz: %memit çalışma zamanında bir işlevin belleğinin profilini çıkarmak için Jypyter Notebook'taki sihirli işlev:

Python Kodunuzdaki Bellek Verimliliğinizi Artırın

Python'u sıklıkla kullandığımız ağır veri kaldırma görevleri göz önüne alındığında, her kod satırının bellek kullanımını yönetmek için yeterli optimizasyona ihtiyacı vardır. Python birçok yerleşik Python işlevine sahipken, başvurulmayan nesneler bellek sızıntılarına neden olur.

Bellek kullanımını dikkate almadan kod tabanınızda çalışan her Python sözdizimini bırakıyorsanız, fazla ileri gitmeden önce geriye bakmak isteyebilirsiniz.