Простой Python. современный стиль программирования - читать онлайн бесплатно полную версию книги . Страница 292

Опять же эти две строки кода выполняются примерно за две миллионные доли

секунды. Мы можем использовать аргумент 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(). Как правило, включение быстрее,

чем создание вручную.