Ответ
Профилирование в Python — это процесс анализа производительности кода для выявления "узких мест" (bottlenecks), то есть участков, которые потребляют больше всего времени или ресурсов. Это позволяет оптимизировать код и улучшить его эффективность.
В Python существует несколько встроенных и сторонних инструментов для профилирования:
1. cProfile (и profile)
cProfile — это стандартный, высокопроизводительный профилировщик, написанный на C. Он собирает статистику о времени выполнения функций и количестве их вызовов. profile — аналогичный модуль, написанный на чистом Python, но менее производительный.
Когда использовать: Для общего анализа производительности приложения и выявления функций, которые занимают больше всего времени.
Пример использования cProfile:
import cProfile
import pstats # Для форматированного вывода результатов
def calculate_sum(n):
"""Простая функция для демонстрации."""
total = 0
for i in range(n):
total += i
return total
def main_task():
"""Основная задача, которую мы хотим профилировать."""
calculate_sum(1_000_000)
calculate_sum(500_000)
# Запуск профилирования
profiler = cProfile.Profile()
profiler.enable() # Начать сбор статистики
main_task() # Выполняем код
profiler.disable() # Остановить сбор статистики
# Вывод результатов
stats = pstats.Stats(profiler)
stats.sort_stats('cumulative').print_stats(10) # Вывести топ-10 функций по кумулятивному времени
# stats.dump_stats('profile_results.prof') # Сохранить результаты в файл
2. line_profiler (с kernprof)
line_profiler — это сторонний инструмент (устанавливается через pip install line_profiler), который позволяет проводить построчное профилирование. Он показывает время выполнения каждой строки кода в функции.
Когда использовать: Когда нужно точно определить, какая именно строка внутри функции является "узким местом".
Пример использования line_profiler:
- Установка:
pip install line_profiler -
Разметка кода: Добавьте декоратор
@profileк функциям, которые хотите профилировать.# my_script.py @profile def calculate_sum_detailed(n): total = 0 for i in range(n): total += i return total @profile def another_slow_part(): _ = [x * x for x in range(100_000)] def main_task_with_line_profiler(): calculate_sum_detailed(1_000_000) another_slow_part() if __name__ == '__main__': main_task_with_line_profiler() -
Запуск: Используйте команду
kernprof.kernprof -l -v my_script.pyРезультаты будут выведены в консоль, показывая время выполнения для каждой строки помеченной функции.
3. memory_profiler
memory_profiler — еще один сторонний инструмент (pip install memory_profiler), предназначенный для анализа потребления памяти. Он может показывать использование памяти построчно или для всего процесса.
Когда использовать: Для выявления утечек памяти или функций, которые потребляют слишком много оперативной памяти.
Пример использования memory_profiler:
- Установка:
pip install memory_profiler -
Разметка кода: Добавьте декоратор
@profile(изmemory_profiler) к функциям.# my_memory_script.py from memory_profiler import profile @profile def create_large_list(): a = [i for i in range(10**6)] b = [i for i in range(2 * 10**6)] del a # Освобождаем память return b if __name__ == '__main__': _ = create_large_list() -
Запуск: Используйте команду
python -m memory_profiler.python -m memory_profiler my_memory_script.pyВывод покажет потребление памяти для каждой строки функции
create_large_list.
Использование этих инструментов позволяет системно подходить к оптимизации производительности и ресурсов Python-приложений.