2009-11-06 3 views
7

Ich möchte einen benutzerdefinierten Verwaltungsbefehl profilieren, der relativ CPU-intensiv ist (rendert ein Bild mit PIL). Wenn ich den folgenden Befehl verwenden, erhalte ich alle Arten von Django-Modulen (admin, ORM etc.) in meinem Profilergebnisse:So profilieren Sie einen benutzerdefinierten Django-Verwaltungsbefehl exklusiv

python -m cProfile manage.py testrender 

ich alle Importe entfernt haben, die Django möglicherweise importieren kann, aber ich bin zu raten, die folgende ist der Täter :

from django.core.management.base import BaseCommand, CommandError 

gibt es eine Möglichkeit cProfile Ergebnisse herauszufiltern? (Es werden nur Dateinamen angezeigt, keine Pfade) Oder gibt es eine andere Möglichkeit, entsprechende Module/Pakete vom Profiling auszuschließen/einzuschließen?

+0

Vielleicht eine Grep selbst machen? – Geo

+0

@Geo Grep hilft nicht viel, da Dateipfade nicht angegeben werden. Nur Dateinamen werden ausgedruckt. Nun nehme ich an, ich habe util.py, das ich profilieren möchte und es gibt irgendwo in Django ein weiteres utils.py. – muhuk

Antwort

13

Ich löste dieses Problem auf folgende Weise:

from cProfile import Profile 
from django.core.management.base import BaseCommand 


class Command(BaseCommand): 
    ... 

    def _handle(self, *args, **options): 
     # Actual code I want to profile 
     pass 

    def handle(self, *args, **options): 
     if options['profile']: 
      profiler = Profile() 
      profiler.runcall(self._handle, *args, **options) 
      profiler.print_stats() 
     else: 
      self._handle(*args, **options) 

Auf diese Weise Profilierung Statistiken im Rahmen von _handle gesammelt werden. Also statt:

python -m cProfile manage.py testrender 

Ich werde laufen müssen:

python manage.py testrender --profile 

was noch besser ist.

+0

große Antwort, vielen Dank für das Teilen. – Hassek

+1

Scheint, dass dies mit den Änderungen in Django nicht länger gültig ist, aber ich habe es herausgefunden. [Hier ist ein aktuelles Beispiel] (https://gist.github.com/4236077). – Tom

0

Wenn ich keine Antworten finden kann. Gprof2Dot als explained here kann ein akzeptabler Hack sein.

Es filtert keine Module aus, die mich nicht interessieren, aber hoffentlich wird es die Überprüfung der Ergebnisse erleichtern, indem ich meine Code- und Django-Module visuell voneinander unterscheide.

0

Trennen Sie die PIL-Funktionalität in eine eigene Funktion/Klasse in einem eigenen Modul und importieren Sie sie von Ihrem Verwaltungsbefehl. Dann können Sie die PIL-Funktionalität unabhängig von Django testen/profilieren.

+0

Es ist genau wie Sie sagten, in einem separaten Modul und aus dem Befehl importiert werden. Das Problem ist, wie man eigenständig profiliert. Ich brauche nicht einmal Superisolation, ich will nur 50 zusammenhängende Einträge und 950 nicht verwandte. Möchtest du, dass ich etwas Code poste? – muhuk

+0

Ich verstehe nicht, wo das Problem liegt. Wenn Sie es in ein eigenes Modul (das überhaupt keine Referenzen auf Django hat) aufgeteilt haben, können Sie nicht ein einfaches Test-Netzwerk schreiben, um dieses Modul auszuprobieren, und dieses Profil erstellen? Ich kann nicht sehen, wie es dann Django Code in Ihrer Profilausgabe geben würde. –

+0

Erstellen Sie eine andere ausführbare Datei meinst du? Das wäre eine Lösung. Ich versuche nur herauszufinden, ob es irgendwie möglich wäre, einen Django-Verwaltungsbefehl zu verwenden. – muhuk

Verwandte Themen