Frage

Ich verwende cProfile mein Python-Programm zu profilieren. Basierend auf dieses Gespräch Ich hatte den Eindruck, dass KCacheGrind könnte die Ausgabe von cProfile analysieren und anzuzeigen.

Allerdings, wenn ich gehen, um die Datei zu importieren, KCacheGrind nur zeigt ein ‚Unbekanntes Dateiformat‘ Fehler in der Statusleiste und setzt sich dort nichts angezeigt wird.

Gibt es etwas Besonderes ich tun muss, bevor mein Profil Statistiken mit KCacheGrind kompatibel sind?

...
if profile:
    import cProfile

    profileFileName = 'Profiles/pythonray_' + time.strftime('%Y%m%d_%H%M%S') + '.profile'

    profile = cProfile.Profile()
    profile.run('pilImage = camera.render(scene, samplePattern)')

    profile.dump_stats(profileFileName)
    profile.print_stats()
else:            
    pilImage = camera.render(scene, samplePattern)
...

Paketversionen

  • KCacheGrind 4.3.1
  • Python 2.6.2
War es hilfreich?

Lösung 3

Es kann mit einem externen Modul lscallproftree

genannt erfolgen

In diesem Artikel wird erklärt, wie: CherryPy - cachegrind

Mit meinem resultierenden Code aussehen wie so:

...
if profile:
    import cProfile
    import lsprofcalltree

    profileFileName = 'Profiles/pythonray_' + time.strftime('%Y%m%d_%H%M%S') + '.profile'

    profile = cProfile.Profile()
    profile.run('pilImage = camera.render(scene, samplePattern)')

    kProfile = lsprofcalltree.KCacheGrind(profile)

    kFile = open (profileFileName, 'w+')
    kProfile.output(kFile)
    kFile.close()

    profile.print_stats()    
else:            
    pilImage = camera.render(scene, samplePattern)
...

Wenn jemand einen Weg kennt, dies zu tun, die keine externes erfordern (dh. Nicht mit Python ausgeliefert) -Modul, würde ich immer noch sehr interessiert sein, davon zu hören.

Andere Tipps

Mit cProfile können Sie auch bestehende Programme profilieren, ohne gesonderte Profilierung Skript zu machen. Führen Sie einfach Programm mit Profiler

python -m cProfile -o profile_data.pyprof script_to_profile.py

und offene Profildaten in kcachegrind mit pyprof2calltree, deren -k Schalter öffnet automatisch Daten in kcachegrind

pyprof2calltree -i profile_data.pyprof -k

Zum Beispiel Profilierungs ganzen Paster-Servers und Webapp würde wie dieses

erfolgen
python -m cProfile -o pyprof.out `which paster` serve development.ini

pyprof2calltree kann mit easy_install installiert werden.

könnten Sie verwenden profilestats.profile Dekorateur ($ pip install profilestats) - ein einfaches Wrapper für pyprof2calltree Modul (Rebranding von lsprofcalltree.py):

from profilestats import profile

@profile
def func():
    # do something here

Script kann wie gewohnt ausgeführt werden soll. profilestats erstellt zwei Dateien. cachegrind.out.profilestats und profilestats.prof in KCachegrind-kompatibel und cProfile formatiert entsprechend

Wenn das, was Sie tatsächlich versuchen zu tun, ist zu sehen, welche Teile des Codes auf Geschwindigkeit optimiert werden können, und Sie können es zufällig in dem Debugger anhalten, diese Methode funktioniert . Es mag überraschen, aber Sie brauchen nicht sehr viele stackshots.

3 Möglichkeiten differents Ihren Code und Visualisierung von Ergebnissen in KCachegrind / Qcachegrind zum Profil:

I - Cprofile

1 - Profil myfunc () von ipython

import cProfile
filename = 'filename.prof'
cProfile.run('myfunc()', filename)

2 - Konvertieren Sie Ihre Datei in eine verwendbaren kcachegrind Datei in Ihrem Shell

sudo pip install pyprof2calltree
pyprof2calltree -i filename.prof -o callgrind.filename.prof

3 - Offene callgrind.filename.prof in kcachegrind

II - Eingebettete Cprofile

. 1 - Profil paar Zeilen im Code

import cProfile
filename = 'filename.prof'
pr = cProfile.Profile()
pr.enable()
# ... lines to profile ...
pr.disable()
pr.dump_stats(filename)

2 - Konvertieren Sie Ihre Datei in eine verwendbaren kcachegrind Datei in Ihrem Shell

sudo pip install pyprof2calltree
pyprof2calltree -i filename.prof -o callgrind.filename.prof

3 - Offene callgrind.filename.prof in kcachegrind

III - Yappi

1 - Profil myfunc () von ipython oder aus dem Code

import yappi
filename = 'callgrind.filename.prof'
yappi.set_clock_type('cpu')
yappi.start(builtins=True)
myfunc()
stats = yappi.get_func_stats()
stats.save(filename, type='callgrind')

2 - Offene callgrind.filename.prof in kcachegrind

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top