Что такое профилирование в Python и какие инструменты для него используются?

«Что такое профилирование в Python и какие инструменты для него используются?» — вопрос из категории Python, который задают на 33% собеседований Data Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Профилирование — это процесс измерения производительности кода для выявления узких мест (bottlenecks) по времени выполнения, использованию памяти или другим ресурсам.

В своей работе я использую несколько инструментов для разных целей:

  1. 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')  # Сортировка по общему времени
  2. line_profiler (пакет line_profiler): Когда нужно понять, какие именно строки внутри функции работают медленно.

    # Декоратор @profile для функции, которую нужно проанализировать
    # Запуск: kernprof -l -v my_script.py
  3. 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)
  4. py-spy: Sampling-профайлер, который может работать без модификации кода и даже профилировать работающие production-процессы.

    py-spy top --pid 12345
  5. Встроенные средства отладки и визуализации в IDE: Например, профайлер в PyCharm, который дает удобный графический интерфейс для анализа.

Общий подход: Сначала cProfile помогает найти «горячие» функции, затем line_profiler или memory_profiler детально анализируют их. Для production-среды часто использую py-spy или интеграцию с системами мониторинга (например, отправка метрик в Prometheus).