секунды. Мы можем использовать аргумент repeat функции repeat() модуля timeit,
чтобы выполнить код большее количество раз. Сохраните этот файл под име-
нем timeit2.py:
from timeit import repeat
print(repeat('num = 5; num *= 2', number=1, repeat=3))
Попробуйте запустить его, чтобы увидеть what transpires:
$ python timeit2.py
[1.691998477326706e-06, 4.070025170221925e-07, 2.4700057110749185e-07]
Первый запуск занял две миллионные доли секунды, а второй и третий прошли
быстрее. Почему? Для этого может быть много причин. Это могло произойти, на-
пример, потому, что мы тестировали очень небольшой фрагмент кода и скорость
его выполнения зависит от того, что компьютер делал в эти моменты, как система
Python оптимизировала вычисления, и от многого другого.
Или же это могла быть случайность. Попробуем сделать что-то более реали-
стичное, чем присвоение переменных и вызов функции sleep(). Мы измерим про-
изводительность, сравнив эффективность нескольких алгоритмов (программной
логики) и структур данных (механизмов хранения).
Алгоритмы и структуры данных
Дзен Python (http://bit.ly/zen-py) гласит: «Должен существовать один, и желательно
только один, очевидный способ сделать это». К сожалению, иногда он не является
очевидным и вам приходится сравнивать альтернативные варианты. Например,
что лучше использовать для создания списка: цикл for или включение списка?
И что на самом деле значит «лучше»: быстрее, проще для понимания, менее за-
тратно по ресурсам или более характерно для Python?
374
Глава 12. Быть питонщиком
В следующем упражнении мы создадим список разными способами, сравнив
скорость, читаемость и стиль. Перед вами файл time_lists.py:
from timeit import timeit
def make_list_1():
result = []
for value in range(1000):
result.append(value)
return result
def make_list_2():
result = [value for value in range(1000)]
return result
print('make_list_1 takes', timeit(make_list_1, number=1000), 'seconds')
print('make_list_2 takes', timeit(make_list_2, number=1000), 'seconds')
В каждой функции мы добавляем в список 1000 элементов и вызываем каждую
функцию 1000 раз. Обратите внимание на то, что в этом тесте мы вызываем функ-
цию timeit(), передавая ей имя функции в качестве первого аргумента вместо кода.
Давайте ее запустим:
$ python time_lists.py
make_list_1 takes 0.14117428699682932 seconds
make_list_2 takes 0.06174145900149597 seconds
Включение списка отработало как минимум в два раза быстрее, чем добавление
элементов в список с помощью функции append(). Как правило, включение быстрее,
чем создание вручную.