На этом шаге мы рассмотрим использование модуля timeit.
Модуль timeit позволяет измерить время выполнения небольших фрагментов кода с целью оптимизации программы. Прежде чем использовать модуль, необходимо подключить его с помощью инструкции:
from timeit import Timer
Timer([stmt='pass'][, setup='pass'][, timer=<timer function>])
В параметре stmt указывается код (в виде строки), время выполнения которого предполагается измерить. Параметр setup позволяет указать код, который будет выполнен перед измерением времени выполнения кода в параметре stmt. Например, в параметре setup можно подключить модуль.
Получить время выполнения можно с помощью метода timeit ([number=1000000]). В параметре number указывается количество повторений. Для примера просуммируем числа от 1 до 10000 тремя способами и выведем время выполнения каждого способа.
#-*- coding: utf-8 -*- from timeit import Timer code1 = """\ i, j = 1, 0 while i < 10001: j += i i += 1 """ t1 = Timer(stmt=code1) print("while:", t1.timeit(number=10000)) code2 = """\ j = 0 for i in range(1, 10001): j += i """ t2 = Timer(stmt=code2) print("for:", t2.timeit(number=10000)) code3 = """\ j = sum (range(1, 10001)) """ t3 = Timer(stmt=code3) print("sum:", t3.timeit(number=10000)) input ()
Примерный результат выполнения (зависит от мощности компьютера):
while: 25.13958657675797
for: 14.858756346126274
sum: 5.050326964385583
Как видно из результата, цикл for работает почти в два раза быстрее цикла while, а функция sum () в данном случае является самым оптимальным решением задачи.
Метод repeat ([repeat=3] [, number=1000000]) вызывает метод timeit () указанное количество раз (задается в параметре repeat) и возвращает список значений. Аргумент number передается в качестве параметра методу timeit (). Для примера создадим список со строковыми представлениями чисел от 1 до 10000. В первом случае для создания списка используем цикл for и метод append (), а во втором - генератор списков.
# -*- coding: utf-8 -*- from timeit import Timer code1 = """\ arr1 = [] for i in range(1, 10001): arr1.append(str(i)) """ t1 = Timer(stmt=code1) print("append:", t1.repeat(repeat=3, number=2000)) code2 = """\ arr2 = [str(i) for i >in range(1, 10001)] """ t2 = Timer(stmt=code2) print("генератор:", t2.repeat(repeat=3, number=2000)) input()
Примерный результат выполнения:
append: [12.780722522318046, 12.724886804338505, 12.903999274243034]
генератор: [10.290514465192551, 10.268080216531082, 10.219959743593058]
Как видно из результата, генераторы списков работают быстрее.
Со следующего шага мы начнем рассматривать пользовательские функции.