Короткий ответ
Профилирование — это автоматизированный сбор статистики по всей программе (сколько раз вызвана каждая функция и сколько времени она заняла), а ручные замеры time.time() показывают время только в тех местах, где их явно расставили.
Как это работает подробнее
Профилировщик (например, cProfile) инструментирует вызовы функций на лету и строит таблицу: число вызовов, суммарное время внутри функции (tottime), время с учётом вложенных вызовов (cumtime). Это даёт полную картину без ручной разметки кода.
Пример кода
example.py
import cProfile
def slow_function():
total = sum(i * i for i in range(10**6))
return total
cProfile.run("slow_function()")
# Вывод содержит столбцы ncalls, tottime, cumtime для каждой функции —
# по ним видно, где реально тратится время, а не только итоговую длительность.Что использовать на практике
- Практика. Профилирование запускают перед оптимизацией, чтобы не тратить время на ускорение кода, который и так быстрый. Для коротких скриптов достаточно cProfile, для долгоживущих сервисов — сэмплирующие профилировщики с меньшим overhead.
Подводные камни
- Риск. Начинают оптимизировать код по интуиции, не измерив, где реально тратится время; забывают, что профилирование само по себе замедляет выполнение и искажает абсолютные цифры (относительные пропорции обычно показательны).