А как вы профилируете Python-код? Я на собеседованиях всегда называл CProfile, New Relic, django-debug-toolbar а потом спрашивал самих интервьюверов, что используют они. Они ничего нового не называли. Вот только CProfile больно, New Relic дорого, а django-debug-toolbar только для Django (ого!). Ну что же, давайте поговорим про нормальные профайлеры.

  • profiling – профайлер, выводящий кравсивый TTerminal UI в стиле htop, с вложенностью, сортировкой, цветами. Позволяет в live-режиме смотреть, что происходит в программе. Крайне занимательно. Из минусов: нет flamechart’а, нельзя цеплять к запущенным процессам.

  • vprof – запускаете через него код, профайлер собираетстатистику, а по завершению открывает Web UI с flamechart’ом, тепловой картой кода, таблицой по используемому фрагментами кода CPU и графиком потребления памяти. Минусы: нельзя цеплять к запущенным процессам, нельзя смотреть в live-режиме.

  • py-spy – профайлер для Python, написанный на Rust. Умеет цепляться к запущенным процессам, но в целом у меня он не особо зашёл: flamechart строится как-то странно (при регулировке rate и duration он то не собирает всю информацию, то не хочет завершать работу), а live-таблица не особо удобная и умирает по завершению процесса. В общем, вые описанные лучше, но прицепиться к запущенному процессу они не могут, а py-spy может.

  • pyflame – профайлер от uber для построения flamechart’а с возможностью подключаться к запущенному процессу. Работает отлично, но установка несколько мучительная: собирать его нужно из исходников, а генерировать график вообще сторонней утилитой, написанной на perl. Работа с ним выглядит как-то так:

cat profile.txt | ./FlameGraph/flamegraph.pl > flame.svg```


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