Ответ
Профилирование — это процесс измерения производительности кода для выявления узких мест (bottlenecks) по времени выполнения, использованию памяти или другим ресурсам.
В своей работе я использую несколько инструментов для разных целей:
-
cProfile/profile(стандартная библиотека): Для анализа времени выполнения функций. Показывает, сколько раз вызывалась каждая функция и сколько времени на это ушло.import cProfile import re def test_func(): data = [f"string{i}" for i in range(10000)] return [re.search(r'string(d+)', s) for s in data] # Запуск профилирования profiler = cProfile.Profile() profiler.enable() test_func() profiler.disable() profiler.print_stats(sort='cumtime') # Сортировка по общему времени -
line_profiler(пакетline_profiler): Когда нужно понять, какие именно строки внутри функции работают медленно.# Декоратор @profile для функции, которую нужно проанализировать # Запуск: kernprof -l -v my_script.py -
memory_profiler(пакетmemory_profiler): Для отслеживания потребления памяти построчно и обнаружения утечек.from memory_profiler import profile @profile def memory_intensive_func(): large_list = [i for i in range(1000000)] return sum(large_list) -
py-spy: Sampling-профайлер, который может работать без модификации кода и даже профилировать работающие production-процессы.py-spy top --pid 12345 -
Встроенные средства отладки и визуализации в IDE: Например, профайлер в PyCharm, который дает удобный графический интерфейс для анализа.
Общий подход: Сначала cProfile помогает найти «горячие» функции, затем line_profiler или memory_profiler детально анализируют их. Для production-среды часто использую py-spy или интеграцию с системами мониторинга (например, отправка метрик в Prometheus).
Ответ 18+ 🔞
А, профилирование, говоришь? Ну это когда твой код ползёт как черепаха в сиропе, и ты начинаешь подозревать, что где-то сидит пидарас шерстяной, который всё тормозит. Э бошка думай, как это найти.
В общем, я обычно действую по принципу «вилкой в глаз или в жопу раз». Беру стандартный cProfile — это как хуй с горы, простой и тяжёлый. Запускаешь, а он тебе вываливает всю правду: какая функция сколько времени сосалка у процессора была и сколько раз её вызывали. Прям терпения ноль ебать, смотришь на отчёт и понимаешь, что твоя «оптимизированная» функция вызывается десять тысяч раз, ёпта.
import cProfile
import re
def test_func():
data = [f"string{i}" for i in range(10000)]
return [re.search(r'string(d+)', s) for s in data]
# Запуск профилирования
profiler = cProfile.Profile()
profiler.enable()
test_func()
profiler.disable()
profiler.print_stats(sort='cumtime') # Сортировка по общему времени
Смотришь на это и думаешь: «Ни хуя себе, регулярки-то жрут как не в себя!». Но cProfile — это как рентген, видно кости, но не видно, какая именно трещина. Поэтому дальше идёт line_profiler. Вот это уже манда с ушами, но полезная. Он тебе каждую строчку в функции распишет по времени. Ставишь декоратор @profile и видишь, что та самая строка с поиском по списку — это пиздопроебибна по затратам. Волнение ебать, когда находишь виновника.
Потом, если код жрёт память как дракон, беру memory_profiler. Запускаешь, а он тебе показывает, как на каждой строчке память растёт. И тут выясняется, что твой «эффективный» алгоритм создаёт промежуточный список на овердохуища элементов, который никому не нужен. Сам от себя охуел.
А для продакшена, когда процесс уже бежит и его нельзя останавливать, есть py-spy. Это как подкрасться к работающему коду с хитрая жопа и подсмотреть, чем он там занят. Командой py-spy top --pid 12345 смотришь в реальном времени, какая функция сейчас вздрачивает процессор. Бывает, смотришь и думаешь: «Какого хуя ты тут делаешь? Ты же вообще не должна вызываться!».
Короче, чувак, общая схема простая: сначала cProfile даёт общую картину — где болит. Потом line_profiler или memory_profiler тычут тебя носом в конкретную строку — почему болит. А для живых систем py-spy — это как стетоскоп, чтобы послушать хрипы, не убивая пациента. Главное — не гадать, а измерять, а то можно впендюрить кучу времени на оптимизацию не того места. Доверия ебать ноль к своей интуиции в таких делах.