Code


Version 8 (modified by akaihola, 5 years ago) (diff)

Added links to snippets and apps providing profiling tools

Profiling Django

django-command-extensions provides a runprofileserver command for running the development server with hotshot/profiling tools enabled. It has the ability to export KCacheGrind compatible profile files.

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 django snippet 461.

Profiling Middleware and 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.

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 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 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)

Attachments (5)

Download all attachments as: .zip