2009-09-30 10 views
5

Estoy usando cProfile, pstats y Gprof2dot para crear un perfil de un script python bastante largo.cProfile and Python: Encontrar el número de línea específico que el código pasa más tiempo en

Los resultados me dicen que la mayor parte del tiempo se usa llamando a un método en un objeto que he definido. Sin embargo, lo que realmente me gustaría es saber exactamente qué número de línea dentro de esa función está consumiendo el tiempo.

¿Alguna idea de cómo obtener esta información adicional?

(Por cierto, estoy usando Python 2.6 en OSX Snow Leopard si eso ayuda ...)

Respuesta

1

Supongamos que la cantidad de tiempo que se "consumido" es un número, como 40%. Entonces, si solo interrumpe el programa o lo pausa en un tiempo aleatorio, la probabilidad es del 40% de que lo verá, expuesto con precisión en la pila de llamadas. Haga esto 10 veces, y en 4 muestras, +/-, lo verá.

This tells why it works.This is an example.

2

cProfile no realizar un seguimiento de los números de línea dentro de una función; solo rastrea el número de línea donde se definió la función.

cProfile intenta duplicar el comportamiento de profile (que es puro Python). profile usa pstats para almacenar los datos que se ejecutan, y pstats solo almacena los números de línea para las definiciones de funciones, no para las declaraciones individuales de Python.

Si necesita resolver con granularidad más fina lo que está comiendo todo su tiempo, entonces necesita refactorizar su función grande en varias funciones más pequeñas.

+0

refactorizar en funciones pequeñas no siempre es posible, y las llamadas a funciones son costosas en python, esto puede afectar la velocidad de manera significativa. –

+0

+1: dividir en partes más pequeñas es la forma más sencilla. También puede envolver algunos bloques en funciones temporales definidas localmente (para crear perfiles). Esto incluso permitirá llamadas de contabilidad separadas a la misma función desde diferentes lugares. –

3

Hay un line profiler en python escrito por Robert Kern.

+0

Esto se parece a lo que estoy buscando ... sin embargo, no puedo instalar en OSX Snow Leopard, ya que está buscando el 10.4 SDK (que no está en 10.6). No puedo encontrar la referencia en el script de compilación para cambiar esto ... Si me ayuda el mensaje de error exacto que aparece al usar "sudo python setup.py install" es: Compilando con un SDK que no parece existe: /Developer/SDKs/MacOSX10.4u.sdk –

+0

No tengo este problema en mi macbook (también en leopardo de las nieves). Aconsejaría que no use sudo para la instalación, a menudo es una mala idea (puede romper el sistema de python, y sudo no exporta las variables de env como es de esperar). Le aconsejaría que incluya este problema en la lista de correo de enthought-dev –

Cuestiones relacionadas