2009-11-06 13 views
7

Vorrei creare un profilo per un comando di gestione personalizzato che richiede un utilizzo relativamente elevato della CPU (esegue il rendering di un'immagine utilizzando PIL). Quando uso il seguente comando ricevo tutti i tipi di moduli di Django (admin, ORM, ecc) nei miei risultati profilazione:Come profilare un comando di gestione personalizzata Django esclusivamente

python -m cProfile manage.py testrender 

Ho rimosso tutte le importazioni che possono potenzialmente importare Django, ma sto indovinando il seguente è il colpevole :

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

c'è un modo per filtrare cProfile risultati? (vengono mostrati solo i nomi dei file, nessun percorso) Oppure esiste un altro modo per escludere/includere i rispettivi moduli/pacchetti dalla profilazione?

+0

Forse fare un grep te stesso? – Geo

+0

@Geo grep non è di grande aiuto in quanto non vengono forniti i percorsi dei file. Vengono stampati solo i nomi dei file. Ora supponiamo di avere utils.py che voglio profilare e c'è un altro utils.py da qualche parte in Django. – muhuk

risposta

13

Ho risolto questo problema nel modo seguente:

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) 

In questo modo le statistiche di profiling sono raccolti nell'ambito di _handle. Così, invece di:

python -m cProfile manage.py testrender 

Dovrò correre:

python manage.py testrender --profile 

che è ancora meglio.

+0

ottima risposta, grazie per la condivisione. – Hassek

+1

Sembra che questo non sia più valido con le modifiche in Django, ma l'ho capito da questo. [Ecco un esempio aggiornato] (https://gist.github.com/4236077). – Tom

0

Se non riesco a trovare alcuna risposta. Gprof2Dot come explained here può essere un trucco accettabile.

Non filtra i moduli Non sono interessato, ma si spera che semplificherà l'ispezione dei risultati separando visivamente il mio codice e i moduli Django.

0

Separare la funzionalità PIL nella propria funzione/classe nel proprio modulo e importarla dal comando di gestione. Quindi puoi testare/profilare la funzionalità PIL indipendentemente da Django.

+0

È proprio come hai detto tu, in un modulo separato ed è stato importato dal comando. Il problema è come profilare indipendentemente. Non ho nemmeno bisogno di super isolamento, non voglio solo 50 voci correlate e 950 non correlate. Vorresti che inserissi del codice? – muhuk

+0

Non capisco dove sia il problema. Se lo hai separato nel suo modulo (che non ha alcun riferimento a Django), non puoi scrivere una semplice bardatura di prova per esercitare quel modulo e il profilo? Non riesco a vedere come ci sarebbe alcun codice Django nel tuo profilo di output allora. –

+0

Creare un altro eseguibile vuoi dire? Questa sarebbe una soluzione. Sto solo cercando di scoprire se sarebbe possibile in qualche modo, usando un comando di gestione Django. – muhuk

Problemi correlati