Как профилировать приложение django по времени выполнения?

Мое приложение Django безумно медленное, я хочу выяснить, на что нужно время:

Я попробовал Django-debug-toolbar, но не смог найти панель, которая могла бы дать мне разбивку времени загрузки.

Мои требования:

  • Вывод типа трассировки стека с указанием времени выполнения для каждого модуля, вызванного для визуализации страницы.
  • Я хочу понять, какая часть всего процесса рендеринга страницы требует времени?
  • Кроме того, какая часть потребляет сколько ЦП [САМОЕ ВАЖНО]?

Может django-debug-toolbar это сделать? [Какая панель? ]

Любое другое приложение django, способное на это?


person Yugal Jindle    schedule 29.05.2012    source источник
comment
stackoverflow.com/questions/2361985/profiling-django   -  person Ahsan    schedule 30.05.2012
comment
@Ahsan Это подсказало Django-debug-toolbar, что само по себе не служит моей цели!   -  person Yugal Jindle    schedule 30.05.2012


Ответы (5)


django-debug-toolbar 2.0

По умолчанию django-debug-toolbar 2.0 включает _ 3_ в настройках DEBUG_TOOLBAR_PANELS. Вы можете просмотреть эту информацию о профилировании, установив флажок «Профилирование» на панели инструментов и обновив страницу.

Старые версии django-debug-toolbar:

Вы можете попробовать панель профилирования django-debug-toolbar (убедитесь, что вы используете последнюю версию приложения из github). Включите панель, например, в вашем settings.py:

DEBUG_TOOLBAR_PANELS = (
  'debug_toolbar.panels.version.VersionDebugPanel',
  'debug_toolbar.panels.timer.TimerDebugPanel',
  'debug_toolbar.panels.profiling.ProfilingDebugPanel',
)

Существование этой панели не задокументировано в файле readme django-debug-toolbar; поэтому я отвечаю здесь в первую очередь.

person ppetrid    schedule 26.11.2012
comment
N.B. Если вы используете Debian или Ubuntu, вам также потребуется apt-get install python-profiler, чтобы получить модули profile и pstats, поскольку они имеют несвободные лицензии (спасибо Disney). - person Tony; 14.05.2013

Наконец-то нашел способ профилировать мое веб-приложение django:

Следующие два фрагмента django предоставляют middleware профилирование всего потока и вывод, если запрос имеет prof в GET keys:

Простое и понятное профилирование - спасло мне день!

person Yugal Jindle    schedule 30.05.2012
comment
Спасибо. Это один из самых ценных советов, которые я видел за долгое время. Это так просто, я не могу поверить, что писал приложения Django без профилирования. - person AgDude; 11.04.2014
comment
Не могли бы вы объяснить, как его настроить? просто чтобы куда-нибудь положить этот файл? - person Dejell; 08.11.2016

Вместо этого я бы порекомендовал написать несколько интеграционных тестов или, по крайней мере, использовать встроенный клиент тестирования для автоматизации запросов и размещения множества отладочных операторов в представлениях.

В Django есть встроенный клиент для тестирования:

from django.test.client import Client
c = Client()
response = c.post('/slow_url/')

А затем, на ваш взгляд:

def slow_url(request):
    start = time.time()
    print 'Started db query'
    result = SomeComplexModel.objects.all()
    print 'Finished db query, took ', time.time() - start
    return render('some_complex_template.html', {'result': result})  

Автоматизация процесса создания запросов и возможность повторять их снова и снова, пока вы вносите небольшие изменения, - вот как вы улучшите свой код. Процессорное время можно вычислить, если измерить время, необходимое для запуска каждой функции. Вам не понадобится много времени, чтобы отточить ту часть, которая на самом деле поглощает ресурсы.

person aychedee    schedule 29.05.2012
comment
Это очевидный подход, но непрактичный. - person Yugal Jindle; 30.05.2012
comment
Так как я ищу инструмент для профилирования, я всегда могу сделать это вручную! - person Yugal Jindle; 30.05.2012
comment
Если вы еще не пишете какие-либо модульные или интеграционные тесты, вам действительно стоит подумать о том, чтобы начать ... - person aychedee; 30.05.2012
comment
Это нормально, я знаю значение Test - но это не ответ на мой вопрос. У меня уже есть тесты, но если мне нужно временно поставить отметки времени, я могу сделать это в своих представлениях. - person Yugal Jindle; 30.05.2012

Это не профилирование, но я обычно просто использую представление для расчета времени выполнения, оно работает также для представлений, которым требуется вход в систему, оно отображает время выполнения на простой странице

 def test(request):
     from django.test.client import Client
     import time

     c = Client()

     #client login if needed
     response = c.post('/login/', {'username': 'admin', 'password': 'password'})

     start = time.time()
     response = c.get('/pagetotest/')

     #print response
     #print 'Finished, time: ', time.time() - start # output to console
     end=time.time() - start
     return render(request,'loadingtime.html',{'time':end})

это хорошее начало, я думаю, надеюсь, это кому-то поможет

person Cherif KAOUA    schedule 19.09.2014

django-silk может помочь.

  • Установите его с помощью: pip install django-silk
  • Добавьте это в settings.py:
MIDDLEWARE = [
    ...
    'silk.middleware.SilkyMiddleware',
    ...
]

INSTALLED_APPS = (
    ...
    'silk'
)
  • Добавьте маршрут в urls.py:
urlpatterns += [url(r'^silk/', include('silk.urls', namespace='silk'))]
  • Наконец, создайте соответствующие таблицы в базе данных с помощью:
python manage.py makemigrations
python manage.py migrate

Затем вы можете перейти в своем интернет-браузере к /silk, чтобы найти там запрошенную страницу.

person Hakim    schedule 08.08.2018