Version 8 (modified by 15 years ago) ( diff ) | ,
---|
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)
-
runserver-profiler.diff
(1.3 KB
) - added by 19 years ago.
patch for management.py enables profiling for runserver
-
runserver-profiler2.diff
(1.2 KB
) - added by 18 years ago.
updated the patch against the latest revision
-
runserver-profiler2.2.diff
(1.2 KB
) - added by 18 years ago.
updated the patch against the latest revision and made the path configurable
-
profiler-cprofile.py
(547 bytes
) - added by 17 years ago.
Adapted profile handler to use cProfile module. Place in django/core/handlers and set PythonHandler in apache conf
-
runserver-profiler3.diff
(2.3 KB
) - added by 16 years ago.
New patch against r7569. Extend runserver command with '--profile' argument. Will run djangos development server with profiling output into systems temporary directory.
Download all attachments as: .zip