Сравнение эффективности функций в Python с timeit

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для вычисления времени исполнения кода в Python можно использовать timeit.timeit(). Код передается в виде строки, а число его итераций задается через параметр number:

Python
Скопировать код
import timeit
execution_time = timeit.timeit('sum(range(100))', number=1000)
print(execution_time)

В данном примере мы измеряем время исполнения выражения sum(range(100)), выполняемого 1000 раз. Чтобы повысить точность измерения, увеличьте значение number.

Кинга Идем в IT: пошаговый план для смены профессии

Точное измерение времени функций

Для тестирования отдельных функций напрямую вы можете использовать timeit.Timer(). Для устранения нежелательного влияния процесса измерения на результат рекомендуется применять функцию functools.partial:

Python
Скопировать код
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 можно задать начальные условия и исключить влияние внешних факторов на результаты измерения. Это особенно полезно при тестировании "на месте" сортировки:

Python
Скопировать код
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 фиксирует время, необходимое каждому "спринтеру" для завершения дистанции, определяя победителя.

Python
Скопировать код
import timeit
best_time = timeit.timeit("test_code", number=1000)

🏁 Готовы, старт, марш! Кому удастся прийти к финишу первым?

Работа с IPython и интеграция с командной строкой

В среде IPython использовать %timeit становится проще:

ipython
Скопировать код
%timeit sum(range(100))

В командной строке применяйте -m timeit:

sh
Скопировать код
python -m timeit -s "import random" "random.shuffle(list(range(100)))"

Флаг -s применяется для инициализации начальных условий, обеспечивая тем самым консистентность тестирования.

Сравнение производительности функций

Можно сравнить производительность различных подходов. Это похоже на конкурс эффективности кода, где под "эффективностью" понимается быстродействие:

Python
Скопировать код
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.

Полезные материалы

  1. timeit — Измерение времени выполнения маленьких кусков кода — Документация Python 3.12.1 — официальная документация модуля timeit.
  2. Функции таймера в Python: три способа мониторинга вашего кода – Real Python — в статье приводятся практические примеры и альтернативные методы для измерения времени.
  3. timeit — Измерьте время выполнения маленьких кусков кода на Python. — PyMOTW 3 — исчерпывающее руководство с дополнительными примерами и объяснениями.
  4. Работа с библиотекой Python Timeit с примером – Python Pool — подробное объяснение функций repeat, timeit и default_timer на примерах.
  5. Учебник Python: Вызов внешних команд с помощью модуля Subprocess – YouTube — обучающее видео о Python от проверенного источника, несмотря на то, что оно не сфокусировано на timeit.