= Profiling Django = [http://code.google.com/p/django-command-extensions/ django-command-extensions] provides a `runprofileserver` command for running the development server with hotshot/profiling tools enabled. It has the ability to export [http://kcachegrind.sourceforge.net/ KCacheGrind] compatible profile files. [http://www.mysoftparade.com/blog/django-profile-sql-performance/ django-profile.py] is a script that can be used to profile any Django-powered web-site and find how many SQL-queries are used per page, how heavy html-pages are, etc. See also [http://www.djangosnippets.org/snippets/461/ django snippet 461]. [http://www.djangosnippets.org/snippets/186/ Profiling Middleware] and [http://www.djangosnippets.org/snippets/605/ Extended Profiling Middleware] print profile results for method, additionally groups results by files and by modules. Add the "&prof=" query parameter and you'll see the profiling results in your browser. [http://code.google.com/p/django-profiling/ django-profiling] seems to be another variant of the profiling middleware. ---- {{{django.core.handlers.profiler-hotshot}}} provides profiling support for Django when using mod_python. Hotshot generates logs that can be also used by aplication like kcachegrind. Read [http://www.rkblog.rk.edu.pl/w/p/django-profiling-hotshot-and-kcachegrind/ Django profiling with hotshot and kcachegrind] for more details. Here's a similar solution for the internal development webserver. Apply the included patch to {{{django/core/management.py}}} and start Django with {{{manage.py runserver}}}. Each request will create a {{{.prof}}} file in your {{{/tmp}}} directory. You can then open a Python shell and print the statistics: {{{ >>> import hotshot.stats >>> stats = hotshot.stats.load("stones.prof") >>> stats.strip_dirs() >>> stats.sort_stats('time', 'calls') >>> stats.print_stats(20) }}} You can also use [http://code.djangoproject.com/browser/django/trunk/django/bin/profiling/gather_profile_stats.py gather_profile_stats.py] in the Django distribution to aggregate the generated profilings and open them with pstats.Stats == Using WSGI to profile == An alternative approach is to run django from a boring WSGI server and profile that. For example using wsgiref you can create a really simple WSGI server for running django: {{{ from wsgiref.simple_server import make_server from django.core.handlers.wsgi import WSGIHandler httpd = make_server('', 8000, WSGIHandler()) httpd.serve_forever() }}} Run this using: {{{ $ DJANGO_SETTINGS_MODULE=mysite.settings python myserver.py }}} To profile this run using cProfile (or profile): {{{ $ DJANGO_SETTINGS_MODULE=mysite.settings python -m cProfile myserver.py }}} The default invocation will print the profile stats when you kill the server, it's probably more useful to write to a file and use pstats to read it: {{{ $ DJANGO_SETTINGS_MODULE=mysite.settings python -m cProfile -o mysite.profile myserver.py ... lots of requests ... $ python >>> import pstats >>> s = pstats.Stats("mysite.profile") >>> s.sort_stats("time").print_stats(20) }}}