P
Python для начинающих
@pythonvideo1.2K подп.
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 — это карманный профилировщик для микробенчмарков. Он не заменяет полноценный профилировщик, но идеально подходит, когда нужно честно ответить на вопрос: «Этот способ действительно быстрее, или мне только кажется?»
109
просмотров
2732
символов
Нет
эмодзи
Нет
медиа

Другие посты @pythonvideo

Все посты канала →
Изучаем таймеры и замеры времени с модулем timeit Когда код — @pythonvideo | PostSniper