Что такое профайлеры и как они работают
Что проверяют
Умеете ли вы искать причину медленной работы измерением, а не догадками. Ответ сразу показывает, работали ли вы с профилем по-настоящему: те, кто работал, делят инструменты на трассирующие и выборочные и знают, что показания надо уметь читать.
Как отвечать
Профайлер отвечает на вопрос, где программа проводит время или тратит память. Механизмов два, и они принципиально разные.
Трассирующие подключаются к событиям интерпретатора и фиксируют каждый вход в функцию и выход из неё. В стандартной библиотеке это cProfile: получается полная картина вызовов, но накладные расходы заметны, и сильнее всего искажаются мелкие частые функции.
Выборочные периодически снимают стек и считают, как часто в нём встречается каждый кадр. Накладные расходы малы, инструмент обычно умеет подключаться к уже работающему процессу, поэтому в бою применяют именно их.
Отдельная ветка это память: встроенный трассировщик выделений показывает, какие строки удерживают объекты, и сравнивает снимки между собой.
Чтение результата важнее сбора. Собственное время функции и суммарное вместе с вызванными отвечают на разные вопросы: оптимизируют то, у чего велико собственное время. Удобное представление это дерево вызовов или пламенный график.
До запуска полезно решить, во что упирается программа. Если она ждёт сеть или базу, профиль процессора покажет почти пустоту, а причина будет в запросах.
Где спотыкаются
Оптимизируют по догадке и переписывают красивое место вместо горячего. Замер до и после отсутствует, поэтому доказать улучшение нечем, а иногда его и нет.
Путают собственное и суммарное время. Наверху списка оказывается точка входа, под нож идёт обёртка, а настоящая горячая функция остаётся нетронутой.
Профилируют не там: на игрушечных данных, в отладочном режиме, на машине разработчика. Профиль получается честный, но про другую программу, и накладные расходы самого инструмента принимают за медленный код.