Боб Бельдербос: Профиль сначал... Заметка
RSS Планета Python

Боб Бельдербос: Профиль сначала: набор тестов Django, работающий в 10 раз быстрее

Тестовый набор платформы Rust Django автора изначально выполнялся 30 секунд, что вызвало подозрение относительно производительности базы данных. Однако профилирование с помощью cProfile выявило, что настоящим узким местом была не база данных, сократив время выполнения до 3 секунд. Текст подчеркивает важность измерения производительности, а не угадывания решений, таких как слишком много фикстур или медленная база данных. Он выступает за использование инструментов профилирования, таких как cProfile, для выявления конкретных узких мест. Автор использовал cProfile для создания файла pstats, а затем profiling-explorer для визуализации данных. Профайлер выделил, что функция _hashlib.pbkdf2_hmac, стандартный хешер паролей Django, потребляла чрезмерное время во время тестов. Этот хешер намеренно медленный, чтобы противостоять атакам методом перебора, но он неоправданно замедляет каждый тест, который создает пользователя. Было реализовано простое исправление из пяти строк путем замены на более быстрый хешер MD5, специально для тестов. Это изменение оказалось очень эффективным, значительно сократив время выполнения тестового набора. После этой первоначальной оптимизации следующей самой времязатратной функцией стала cursor.execute, что изначально казалось потенциальной проблемой запросов N+1. Однако дальнейшие измерения подтвердили, что запросов N+1 не было; высокое количество вызовов было связано с законными операциями настройки тестов. Этот опыт подкрепляет основное послание: всегда профилируйте перед оптимизацией, чтобы избежать напрасных усилий и неверных предположений.
CdXz5zHNQW_5c2sgQR2VI.png