Hangi Python bellek profili önerilir? [kapalı]


670

Python uygulamamın bellek kullanımını bilmek istiyorum ve özellikle hangi kod bloklarının / bölümlerinin veya nesnelerinin en fazla bellek harcadığını bilmek istiyorum. Google arama, ticari bir reklamın Python Bellek Doğrulayıcı olduğunu gösterir (yalnızca Windows).

Ve açık kaynak kodlu olanlar PySizer ve Heapy'dir .

Kimseyi denemedim, bu yüzden hangisinin en iyi olduğunu bilmek istedim:

  1. Çoğu ayrıntıyı verir.

  2. Kodumda en az veya hiç değişiklik yapmam gerekiyor.


2
Sızıntıların kaynaklarını bulmak için itiraz tavsiye ederim.
pi.

9
@MikeiLL Böyle sorular için bir yer var: Yazılım Önerileri
Poik

2
Bu, bir soruyu başka bir foruma taşıyabilmemiz için yeterince sık oluyor.
zabumba

Bir ipucu: Birisi gae kullanıyorsa ve bellek kullanımını kontrol etmek istiyorsa - bu büyük bir baş ağrısıdır, çünkü bu araçlar hiçbir şey veya olay başlamadı. Küçük bir şeyi test etmek istiyorsanız, test etmek istediğiniz işlevi ayrı bir dosyaya taşıyın ve bu dosyayı tek başına çalıştırın.
alexche8

4
Ben tavsiye pympler
zzzeek

Yanıtlar:


288

Heapy'nin kullanımı oldukça basittir. Kodunuzun bir noktasında aşağıdakileri yazmanız gerekir:

from guppy import hpy
h = hpy()
print(h.heap())

Bu size böyle bir çıktı verir:

Partition of a set of 132527 objects. Total size = 8301532 bytes.
Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
0  35144  27  2140412  26   2140412  26 str
1  38397  29  1309020  16   3449432  42 tuple
2    530   0   739856   9   4189288  50 dict (no owner)

Ayrıca, nesnelerin nereden kaynaklandığını öğrenebilir ve bununla ilgili istatistikleri alabilirsiniz, ancak buradaki dokümanlar bir şekilde seyrek.

Tk ile yazılmış bir grafik tarayıcı da var.


24
Python 2.7 kullanıyorsanız, bunun gövde versiyonuna ihtiyacınız olabilir: sourceforge.net/tracker/… ,pip install https://guppy-pe.svn.sourceforge.net/svnroot/guppy-pe/trunk/guppy
James Snyder

27
Yığın dokular ... iyi değil. Ancak bu blog yayınını başlamak için çok yararlı buldum: smira.ru/wp-content/uploads/2011/08/heapy.html
Joe Shaw

4
Heapy, python uzantılarında ayrılan belleği içermediğini unutmayın. Birisi boost::pythonnesneleri dahil etmek için ciddileşmek için bir mekanizma geliştirmişse , bazı örnekler görmek güzel olurdu!
amos

34
2014-07-06 itibariyle lepistes Python 3'ü desteklemez.
Quentin Pradet

5
Lepistes3 adı verilen Python 3'ü destekleyen bir lepistes çatalı var.
David Foster

385

Kimse söz beri benim modül işaret edeceğiz memory_profiler bellek kullanımının line-by-line raporunu baskı hızına ve (bu sonuncusu üzerinde psutil ihtiyaçlarına) Unix ve Windows üzerinde çalışır. Çıktı çok ayrıntılı değil ancak amaç, kodun tahsis edilen nesneler üzerinde ayrıntılı bir analiz değil, nerede daha fazla bellek harcadığına dair bir genel bakış sunmaktır.

İşlevinizi dekore ettikten @profileve kodunuzu -m memory_profilerbayrakla çalıştırdıktan sonra , aşağıdaki gibi bir satır satır rapor yazdırır:

Line #    Mem usage  Increment   Line Contents
==============================================
     3                           @profile
     4      5.97 MB    0.00 MB   def my_func():
     5     13.61 MB    7.64 MB       a = [1] * (10 ** 6)
     6    166.20 MB  152.59 MB       b = [2] * (2 * 10 ** 7)
     7     13.61 MB -152.59 MB       del b
     8     13.61 MB    0.00 MB       return a

1
Benim kullanımım için - basit bir görüntü işleme komut dosyası, bazı imleçleri açık bırakan karmaşık bir sistem değil - bu en iyi çözümdü. Kodunuza eklenmiş en az gunk değeriyle çok kolay bir şekilde teslim olun ve neler olduğunu anlayın. Hızlı düzeltmeler için mükemmeldir ve muhtemelen diğer uygulamalar için de mükemmeldir.
driftcatcher

10
Memory_profiler'ı gerçekten basit ve kullanımı kolay buluyorum. Nesne başına değil, her satıra profil oluşturma yapmak istiyorum. Yazı için teşekkürler.
tommy.carstensen

1
@FabianPedregosa doz memory_profiler döngüleri nasıl ele, tanımlayıcı döngü yineleme numarası olabilir?
Glen Fletcher

3
Döngüleri yalnızca satır satır tutarını bildirmeye çalıştığında örtük olarak tanımlar ve yinelenen satırlar bulur. Bu durumda, tüm yinelemelerin maksimumunu alır.
Fabian Pedregosa

1
@FabianPedregosa Çıktısını memory_profilerarabelleğe alıyor mu ? Yanlış bir şey yapıyor olabilirim, ancak tamamlandığında bir fonksiyonun profilini dökmek yerine betiğin bitmesini beklediği anlaşılıyor.
Greenstick

80

Dowser'ı tavsiye ederim . Kurulumu çok kolaydır ve kodunuzda sıfır değişiklik yapmanız gerekir. Zaman içinde her türden nesne sayısını görüntüleyebilir, canlı nesnelerin listesini görüntüleyebilir, canlı nesnelere referansları görüntüleyebilirsiniz, hepsi basit web arayüzünden.

# memdebug.py

import cherrypy
import dowser

def start(port):
    cherrypy.tree.mount(dowser.Root())
    cherrypy.config.update({
        'environment': 'embedded',
        'server.socket_port': port
    })
    cherrypy.server.quickstart()
    cherrypy.engine.start(blocking=False)

Memdebug'u içe aktarın ve memdebug.start öğesini çağırın. Bu kadar.

PySizer veya Heapy'yi denemedim. Başkalarının değerlendirmeleri takdir ediyorum.

GÜNCELLEME

Yukarıdaki kod için CherryPy 2.X, yöntem kaldırılmıştır ve almaz bayrak. Yani eğer kullanıyorsanızCherryPy 3.Xserver.quickstartengine.startblockingCherryPy 3.X

# memdebug.py

import cherrypy
import dowser

def start(port):
    cherrypy.tree.mount(dowser.Root())
    cherrypy.config.update({
        'environment': 'embedded',
        'server.socket_port': port
    })
    cherrypy.engine.start()

3
ama sadece kiraz için mi, bir basit senaryo ile nasıl kullanılır?
Anurag Uniyal

13
CherryPy için değil. CherryPy'yi bir GUI araç kiti olarak düşünün.
sanxiyn

1
fwiw, pysizer sayfası pysizer.8325.org benzer diyor heapy tavsiye gibi görünüyor
Jacob Gabrielson

6
Dowser'ın Dozer adında, diğer web sunucularıyla da kullanabileceğiniz genel bir WSGI portu var: pypi.python.org/pypi/Dozer
Joe Shaw

2
cherrypy 3.1 cherrypy.server.quickstart () kaldırıldı, bu yüzden sadece cherrypy.engine.start () kullanın
MatsLindh

66

İtiraz kütüphanesini düşünün (bkz.http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks örnek bir kullanım örneği için).


7
itiraz, bugün karşılaştığım bir bellek sızıntısı sorununu çözmeme yardımcı oldu. objgraph.show_growth () özellikle yararlıydı
Ngure Nyaga

1
Ben de itirazı gerçekten yararlı buldum. objgraph.by_type('dict')Tüm bu beklenmedik dictnesnelerin nereden geldiğini anlamak gibi şeyler yapabilirsiniz .
dino

18

Muppy (başka bir) Python için Bellek Kullanımı Profiler. Bu araç setinin odak noktası bellek sızıntılarının tanımlanmasıdır.

Muppy, geliştiricilere Python uygulamalarının kimlik bellek sızıntılarına yardımcı olmaya çalışır. Çalışma zamanı sırasında bellek kullanımının izlenmesini ve sızan nesnelerin tanımlanmasını sağlar. Ayrıca, serbest bırakılmayan nesnelerin kaynağının yerini belirleyen araçlar da sağlanır.


13

Python için memprof adlı bir bellek profili geliştiriyorum:

http://jmdana.github.io/memprof/

Dekore edilmiş yöntemlerin yürütülmesi sırasında değişkenlerinizin bellek kullanımını günlüğe kaydetmenizi ve çizmenizi sağlar. Kütüphaneyi aşağıdakileri kullanarak içe aktarmanız yeterlidir:

from memprof import memprof

Ve yönteminizi kullanarak süsleyin:

@memprof

Bu, arazilerin nasıl göründüğüne bir örnektir:

resim açıklamasını buraya girin

Proje GitHub'da barındırılıyor:

https://github.com/jmdana/memprof


3
Bunu nasıl kullanabilirim? A, b, c nedir?
tommy.carstensen

@ tommy.carstensen a, bve cdeğişkenlerin isimleridir. Belgeleri github.com/jmdana/memprof adresinde bulabilirsiniz . Herhangi bir sorunuz varsa, lütfen github'da bir sorun göndermekten çekinmeyin veya dokümantasyonda bulunan posta listesine bir e-posta gönderin.
jmdana

12

Bulduğum meliae Heapy veya PySizer çok daha fonksiyonel olması. Bir wsgi webapp çalıştırıyorsanız, Dozer Dowser'ın güzel bir ara katman yazılımıdır


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.