Skip to content

Instantly share code, notes, and snippets.

@joaodubas
Created November 27, 2011 12:11
Show Gist options
  • Save joaodubas/1397479 to your computer and use it in GitHub Desktop.
Save joaodubas/1397479 to your computer and use it in GitHub Desktop.
Profiler decorator for Django
import hotshot
import os
import time
from django.conf import settings
try:
PROFILE_LOG_BASE = settings.PROFILE_LOG_BASE
except:
PROFILE_LOG_BASE = settings.ROOT
def profile(log_file):
"""Profile some callable.
This decorator uses the hotshot profiler to profile some callable (like
a view function or method) and dumps the profile data somewhere sensible
for later processing and examination.
It takes one argument, the profile log name. If it's a relative path, it
places it under the PROFILE_LOG_BASE. It also inserts a time stamp into the
file name, such that 'my_view.prof' become 'my_view-20100211T170321.prof',
where the time stamp is in UTC. This makes it easy to run and compare
multiple trials.
For more information see: https://code.djangoproject.com/wiki/ProfilingDjango
"""
if not os.path.isabs(log_file):
log_file = os.path.join(PROFILE_LOG_BASE, log_file)
def _outer(f):
def _inner(*args, **kwargs):
# Add a timestamp to the profile output when the callable
# is actually called.
if settings.DEBUG:
(base, ext) = os.path.splitext(log_file)
base = base + "-" + time.strftime("%Y%m%dT%H%M%S", time.gmtime())
final_log_file = base + ext
prof = hotshot.Profile(final_log_file)
try:
ret = prof.runcall(f, *args, **kwargs)
finally:
prof.close()
return ret
else:
return f(*args, **kwargs)
return _inner
return _outer
#!/usr/bin/python
"""Read a profile file generated by hotshot
Can be used as: ./profile ./<file_name>
"""
import hotshot.stats
import sys
stats = hotshot.stats.load(sys.argv[1])
stats.sort_stats('time', 'calls')
stats.print_stats()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment