he encontrado Gprof2Dot extremadamente útil. El resultado de los módulos de perfiles que he probado es bastante poco intuitivo de interpretar.
Gprof2Dot convierte la salida cProfile en un gráfico atractivo, con la cadena más lenta (?) Resaltada y un poco de información sobre cada función (nombre de función, porcentaje de tiempo empleado en esta función y número de llamadas).
An example graph (1429x1896px)
No he hecho mucho con el App Engine, pero al perfilar los alfabetos no webapp, tiendo a perfilar el script que se ejecuta todos los unittests, que pueden no ser muy precisa para el mundo real situaciones
Un método (¿mejor?) sería tener una secuencia de comandos que realiza una solicitud falsa de WSGI, luego perfilar eso.
WSGI es un protocolo realmente simple, es básicamente una función que toma dos argumentos, uno con información de solicitud y el segundo con una función de devolución de llamada (que se usa para establecer encabezados, entre otras cosas). Tal vez algo como lo siguiente (que es posible trabajar-pseudocódigo) ...
class IndexHandler(webapp.RequestHandler):
"""Your site"""
def get(self):
self.response.out.write("hi")
if __name__ == '__main__':
application = webapp.WSGIApplication([
('.*', IndexHandler),
], debug=True)
# Start fake-request/profiling bit
urls = [
"/",
"/blog/view/hello",
"/admin/post/edit/hello",
"/makeanerror404",
"/makeanerror500"
]
def fake_wsgi_callback(response, headers):
"""Prints heads to stdout"""
print("\n".join(["%s: %s" % (n, v) for n, v in headers]))
print("\n")
for request_url in urls:
html = application({
'REQUEST_METHOD': 'GET',
'PATH_INFO': request_url},
fake_wsgi_callback
)
print html
En realidad, la documentación de App Engine explica una mejor manera de perfilar su aplicación:
De http://code.google.com/appengine/kb/commontasks.html#profiling:
Para perfilar el rendimiento de su aplicación, primero cambie el nombre de la función main()
de su aplicación al real_main()
. A continuación, añadir una nueva función principal para su aplicación, llamada profile_main()
como la de abajo:
def profile_main():
# This is the main function for profiling
# We've renamed our original main() above to real_main()
import cProfile, pstats
prof = cProfile.Profile()
prof = prof.runctx("real_main()", globals(), locals())
print "<pre>"
stats = pstats.Stats(prof)
stats.sort_stats("time") # Or cumulative
stats.print_stats(80) # 80 = how many to print
# The rest is optional.
# stats.print_callees()
# stats.print_callers()
print "</pre>"
[...]
Para habilitar el perfilado con su aplicación, establezca main = profile_main
. Para ejecutar su aplicación de manera normal, simplemente configure main = real_main
.
Actualización: esto es ahora parte del SDK de GAE: http://googleappengine.blogspot.com/2010/02/app-engine-sdk-131-including-major.html http: // código .google.com/appengine/docs/python/tools/appstats.html – Turadg