Шаг 112.
Основы языка Python.
Работа с датой и временем. Измерение времени выполнения фрагментов кода

    На этом шаге мы рассмотрим использование модуля timeit.

    Модуль timeit позволяет измерить время выполнения небольших фрагментов кода с целью оптимизации программы. Прежде чем использовать модуль, необходимо подключить его с помощью инструкции:

  from timeit import Timer
Измерения производятся с помощью класса 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]

    Как видно из результата, генераторы списков работают быстрее.

    Со следующего шага мы начнем рассматривать пользовательские функции.




Предыдущий шаг Содержание Следующий шаг