I would like to profile a custom management command that is relatively CPU intensive (renders an image using PIL). When I use the following command I get all sorts of Django modules (admin, ORM etc) in my profiling results:
python -m cProfile manage.py testrender
I have removed all imports that can potentially import Django but I am guessing the following is the culprit:
from django.core.management.base import BaseCommand, CommandError
Is there a way to filter out cProfile
results? (only filenames are shown, no paths) Or, is there any other way to exclude/include respective modules/packages from profiling?
The Python file that contains the code for the custom command is nested inside several directories: At the root level of the Django app, create a directory called management. Within management create a commands directory. Within commands create a file named something similar to print_book_titles.py .
In addition, manage.py is automatically created in each Django project. It does the same thing as django-admin but also sets the DJANGO_SETTINGS_MODULE environment variable so that it points to your project's settings.py file.
django-profiler is util for profiling python code mainly in django projects but can be used also on ordinary python code. It counts sql queries a measures time of code execution. It logs its output via standard python logging library and uses logger profiling .
Separate the PIL functionality into its own function/class in its own module, and import it from your management command. Then you can test/profile the PIL functionality independently of Django.
I solved this problem the following way:
from cProfile import Profile
from django.core.management.base import BaseCommand
class Command(BaseCommand):
...
def _handle(self, *args, **options):
# Actual code I want to profile
pass
def handle(self, *args, **options):
if options['profile']:
profiler = Profile()
profiler.runcall(self._handle, *args, **options)
profiler.print_stats()
else:
self._handle(*args, **options)
This way profiling statistics are gathered within the scope of _handle
. So instead of:
python -m cProfile manage.py testrender
I'll have to run:
python manage.py testrender --profile
which is even better.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With