Сравнение эффективности функций в 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.

Пошаговый план для смены профессии

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

Для тестирования отдельных функций напрямую вы можете использовать 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.
Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Какой модуль в Python используется для измерения времени исполнения кода?
1 / 5