Ответ
Профилирование — это процесс измерения производительности кода для выявления узких мест (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).