2009-11-06 12 views
7

Me gustaría crear un perfil de un comando de administración personalizado que sea relativamente intensivo de la CPU (representa una imagen usando PIL). Cuando utilizo el siguiente comando consigo todo tipo de módulos de Django (admin, ORM, etc) en mis resultados de descripción:Cómo perfilar un comando de administración personalizada de Django exclusivamente

python -m cProfile manage.py testrender 

me han eliminado todas las importaciones que potencialmente pueden importar Django, pero supongo que seguirán los siguientes es el culpable :

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

¿hay una manera de filtrar cProfile resultados? (solo se muestran los nombres de los archivos, no hay rutas) O, ¿hay alguna otra forma de excluir/incluir los respectivos módulos/paquetes de los perfiles?

+0

Quizás haga un grep usted mismo? – Geo

+0

@Geo grep no ayuda mucho ya que no se proporcionan rutas de archivos. Solo se imprimen los nombres de los archivos. Ahora supongamos que tengo utils.py que quiero hacer un perfil y hay otro utils.py en algún lugar de Django. – muhuk

Respuesta

13

He resuelto este problema de la siguiente manera:

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) 

De esta manera las estadísticas de perfiles se reunieron en el marco de _handle. Así que en lugar de:

python -m cProfile manage.py testrender 

Voy a tener que ejecutar:

python manage.py testrender --profile 

que es incluso mejor.

+0

excelente respuesta, gracias por compartir. – Hassek

+1

Parece que esto ya no es válido con los cambios en Django, pero me di cuenta de esto. [Aquí hay un ejemplo actualizado] (https://gist.github.com/4236077). – Tom

0

Si no puedo encontrar ninguna respuesta. Gprof2Dot como explained here puede ser un truco aceptable.

No filtra los módulos No me interesa, pero espero que sea más fácil inspeccionar los resultados visualmente separando mi código y los módulos de Django.

0

Separe la funcionalidad PIL en su propia función/clase en su propio módulo, e impórtelo desde su comando de administración. Luego puede probar/perfilar la funcionalidad PIL independientemente de Django.

+0

Es como dijiste, en un módulo separado y importado del comando. El problema es cómo perfilar de forma independiente. Ni siquiera necesito un súper aislamiento, simplemente no quiero 50 entradas relacionadas y 950 no relacionadas. ¿Te gustaría que publique algo de código? – muhuk

+0

No entiendo dónde está el problema. Si lo tiene separado en su propio módulo (que no tiene ninguna referencia a Django), ¿no puede escribir un arnés de prueba simple para ejercitar ese módulo y crear un perfil de eso? No puedo ver cómo habría ningún código de Django en la salida de tu perfil. –

+0

¿Crees otro ejecutable? Esa sería una solución. Solo estoy tratando de averiguar si sería posible de alguna manera, usando un comando de administración de Django. – muhuk

Cuestiones relacionadas