Сравнение эффективности функций в Python с timeit
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для вычисления времени исполнения кода в Python можно использовать timeit.timeit()
. Код передается в виде строки, а число его итераций задается через параметр number
:
import timeit
execution_time = timeit.timeit('sum(range(100))', number=1000)
print(execution_time)
В данном примере мы измеряем время исполнения выражения sum(range(100))
, выполняемого 1000 раз. Чтобы повысить точность измерения, увеличьте значение number
.
Точное измерение времени функций
Для тестирования отдельных функций напрямую вы можете использовать timeit.Timer()
. Для устранения нежелательного влияния процесса измерения на результат рекомендуется применять функцию functools.partial
:
from timeit import Timer
from functools import partial
def my_function():
# Здесь будет ваш впечатляющий код
pass
# Пора проверить нашу функцию!
timed_run = Timer(partial(my_function)).timeit(number=10000)
print(timed_run)
В этом случае использование partial
помогает уменьшить лишние временные затраты, связанные с процессом измерения.
Подготовка условий с помощью setup
С помощью setup
можно задать начальные условия и исключить влияние внешних факторов на результаты измерения. Это особенно полезно при тестировании "на месте" сортировки:
import timeit
setup_code = """
import random
my_list = list(range(100))
random.shuffle(my_list)
"""
test_code = """
sorted(my_list)
"""
# Данные будут каждый раз перемешиваться перед началом испытания
times = timeit.repeat(stmt=test_code, setup=setup_code, repeat=5, number=1000)
print(min(times)) # Выбираем наилучший результат из всех попыток
Визуализация
Можно рассматривать timeit
как персональный секундомер (⏱) для коротких забегов, где различные участки кода соревнуются в скорости выполнения.
Имя спринтера | ⏱ Время |
---|---|
A (Цикл for) | ⌚ 0.3с |
B (Списковое включение) | ⌚ 0.1с |
C (Функция map) | ⌚ 0.2с |
Модуль timeit
фиксирует время, необходимое каждому "спринтеру" для завершения дистанции, определяя победителя.
import timeit
best_time = timeit.timeit("test_code", number=1000)
🏁 Готовы, старт, марш! Кому удастся прийти к финишу первым?
Работа с IPython и интеграция с командной строкой
В среде IPython использовать %timeit
становится проще:
%timeit sum(range(100))
В командной строке применяйте -m timeit
:
python -m timeit -s "import random" "random.shuffle(list(range(100)))"
Флаг -s
применяется для инициализации начальных условий, обеспечивая тем самым консистентность тестирования.
Сравнение производительности функций
Можно сравнить производительность различных подходов. Это похоже на конкурс эффективности кода, где под "эффективностью" понимается быстродействие:
import timeit
def using_list_comprehension():
return [i for i in range(100)]
def using_map_function():
return map(lambda i: i, range(100))
def using_for_loop():
result = []
for i in range(100):
result.append(i)
return result
# Начинаем состязание!
times = {
'Списковое Включение': timeit.timeit(using_list_comprehension, number=10000),
'Функция Map': timeit.timeit(using_map_function, number=10000),
'Цикл For': timeit.timeit(using_for_loop, number=10000),
}
# Оценим время, за которое они завершили исполнение!
print(sorted(times.items(), key=lambda x: x[1]))
Исследуйте глубже
Для более продвинутого анализа производительности:
- Запускайте тесты несколько раз с помощью
timeit.repeat
и фокусируйтесь на самом коротком времени выполнения. - Перемешивайте данные между тестами, чтобы исключить искажение результатов.
- Изучите, как стандартная библиотека Python и алгоритм сортировки Timsort работают с частично упорядоченными данными.
- Ознакомьтесь поближе с документацией, чтобы лучше понять
timeit
.
Полезные материалы
- timeit — Измерение времени выполнения маленьких кусков кода — Документация Python 3.12.1 — официальная документация модуля
timeit
. - Функции таймера в Python: три способа мониторинга вашего кода – Real Python — в статье приводятся практические примеры и альтернативные методы для измерения времени.
- timeit — Измерьте время выполнения маленьких кусков кода на Python. — PyMOTW 3 — исчерпывающее руководство с дополнительными примерами и объяснениями.
- Работа с библиотекой Python Timeit с примером – Python Pool — подробное объяснение функций
repeat
,timeit
иdefault_timer
на примерах. - Учебник Python: Вызов внешних команд с помощью модуля Subprocess – YouTube — обучающее видео о Python от проверенного источника, несмотря на то, что оно не сфокусировано на
timeit
.