109просмотров
8.8%от подписчиков
24 марта 2026 г.
Score: 120
Изучаем таймеры и замеры времени с модулем timeit Когда код работает медленно, интуиция часто подводит. Кажется, что «вот это место точно тормозит», а на деле время утекает в другом участке. Здесь на сцену выходит модуль timeit — простой способ точно измерить, что действительно медленнее, а что быстрее. ### Почему не time.time()? Наивный подход: import time start = time.time()
result = sum(range(10_000_000))
end = time.time()
print(end - start) Проблемы:
- одно измерение: могли попасть на фоновую нагрузку системы;
- точность зависит от платформы;
- неудобно сравнивать несколько вариантов. timeit решает это: он запускает код много раз, считает среднее время и делает это максимально «чисто». ### Базовый пример использования Минимальный пример из консоли: import timeit t = timeit.timeit("sum(range(1000))", number=10000)
print(t) Параметры важны:
- первый аргумент — строка с кодом, который измеряем;
- number — сколько раз выполнить этот код. Но писать код в строках не всегда удобно. Лучше использовать функции и параметр stmt как объект: import timeit def calc(): return sum(range(1000)) t = timeit.timeit(stmt=calc, number=10000)
print(t) Так проще рефакторить и отлаживать. ### Сравниваем два варианта кода Предположим, мы хотим понять, что быстрее: список или генератор в sum. import timeit def use_list(): return sum([i for i in range(1000)]) def use_gen(): return sum(i for i in range(1000)) t_list = timeit.timeit(use_list, number=10000)
t_gen = timeit.timeit(use_gen, number=10000) print("list:", t_list)
print("gen :", t_gen) На малых диапазонах разница может быть микроскопической, но тенденцию видно: списки часто чуть медленнее, потому что требуют дополнительной памяти. ### Использование setup Если нужна подготовка данных, её не стоит включать в измеряемый код. Для этого есть setup: import timeit setup_code = "data = list(range(10000))" stmt_code = """
result = 0
for x in data: result += x
""" t = timeit.timeit(stmt=stmt_code, setup=setup_code, number=1000)
print(t) Здесь:
- в setup мы генерируем данные один раз для каждого прогона timeit;
- в stmt считаем время только самого алгоритма. ### Немного удобства: repeat Чтобы понять разброс по времени, используйте repeat: import timeit def func(): return sum(range(10_000)) times = timeit.repeat(func, number=1000, repeat=5)
print(times) # список из 5 измерений
print("best:", min(times)) Так можно ориентироваться на минимум как на «лучшие условия» выполнения. --- timeit — это карманный профилировщик для микробенчмарков. Он не заменяет полноценный профилировщик, но идеально подходит, когда нужно честно ответить на вопрос: «Этот способ действительно быстрее, или мне только кажется?»