Короткий ответ
timeit даёт простой способ замерить время выполнения небольших фрагментов кода и обходит типичные ловушки измерения. cProfile — детерминированный профилировщик целых программ на C с разумными накладными расходами, а profile — его чистая Python-реализация. Профилировщики собирают статистику о том, как часто и как долго выполнялись части программы, а не бенчмарки.
Как это работает подробнее
Инструменты не взаимозаменяемы: один отвечает на вопрос, сколько времени занимает кусок кода, другой — на что программа тратит время в целом.
- Модуль timeit. Измеряет время выполнения небольших фрагментов, доступен из командной строки и как вызываемый модуль.
- cProfile и profile. Оба реализуют детерминированное профилирование и собирают статистику выполнения для целых программ.
- Разница реализаций.
cProfile— расширение на C, подходящее для длительных программ;profile— Python-реализация того же интерфейса с большими накладными расходами. - Оформление отчётов. Собранную статистику удобно превращать в отчёты модулем
pstats.
Пример кода
Замер времени и профилирование
python -m timeit "'-'.join(str(n) for n in range(100))"
python -m cProfile myscript.py
python -m cProfile -o output.prof -s sort_order myscript.pyЧто использовать на практике
- Микро-замеры. Для сравнения небольших фрагментов кода используй
timeit. - Поиск узких мест. Чтобы понять, куда уходит время в программе, запускай
cProfile. - Разбор статистики. Оформляй собранный профиль в читаемые отчёты через модуль
pstats.
Подводные камни
- Путаница задач. Профилировщики предназначены для получения профиля выполнения, а не для бенчмарков: точные замеры даёт
timeit. - Накладные расходы. Чистый Python-модуль
profileзаметно медленнееcProfileи плохо подходит для длительных программ. - Крупный фрагмент. Замер слишком большого участка неинформативен — сужай эксперимент до конкретного куска кода.
Как отвечать на собеседовании
- Раздели два инструмента:
timeitдля замера небольших фрагментов →cProfileдля профилирования целых программ → укажи отличие отprofile→ подчеркни, что профиль — это не бенчмарк, и упомяниpstats.