Как профилировать Python-код?
Профилирование Python-кода — это необходимый этап оптимизации производительности, позволяющий точно определить узкие места, из-за которых приложение работает медленно или потребляет слишком много оперативной памяти. Главное золотое правило оптимизации звучит так: сначала всегда измеряй реальные показатели с помощью профилировщиков, и только потом оптимизируй код, а не занимайся преждевременными улучшениями «на глаз».
Для общего анализа производительности приложения и поиска самых медленных функций стандартно применяется встроенный модуль cProfile. Он собирает статистику о количестве вызовов каждой функции и затраченном на них времени, выводя результаты в консоль или сохраняя их в бинарный файл для дальнейшей визуализации с помощью сторонних утилит. Если вам нужно измерить скорость выполнения очень коротких фрагментов кода или отдельных выражений, лучше всего использовать функцию timeit, которая запускает код множество раз и вычисляет среднее время выполнения.
Когда общая картина ясна, но требуется понять, какая именно строка внутри большой функции забирает больше всего ресурсов, на помощь приходит сторонняя библиотека line_profiler. Она позволяет построчно проанализировать время выполнения кода, предварительно разметив нужную функцию специальным декоратором. Для анализа работающих приложений в реальном времени прямо на продакшене без необходимости внедрять код или перезапускать сервисы отлично подходит инструмент py-spy, работающий на уровне операционной системы.
Используя эти инструменты в комплексе, вы сможете системно подходить к ускорению своих программ, находя реальные причины замедления и точечно улучшая архитектуру.