Язык программирования Python

Модуль timeit


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

В следующей программе используется метод timeit() для измерения времени, необходимого для вычисления небольшого фрагмента кода. Измерения проводятся для трех вариантов кода, делающих одно и то же: конкатенирующих десять тысяч строк в одну строку. В первом случае используется наиболее естественный, "лобовой" прием инкрементной конкатенации, во втором - накопление строк в списке с последующим объединением в одну строку, в третьем применяется списковое включение, а затем объединение элементов списка в одну строку:

from timeit import Timer

t = Timer(""" res = "" for k in range(1000000,1010000): res += str(k) """) print t.timeit(200)

t = Timer(""" res = [] for k in range(1000000,1010000): res.append(str(k)) res = ",".join(res) """) print t.timeit(200)

t = Timer(""" res = ",".join([str(k) for k in range(1000000,1010000)]) """) print t.timeit(200)

Разные версии Python дадут различные результаты прогонов:

# Python 2.3 77.6665899754 10.1372740269 9.07727599144

# Python 2.4 9.26631307602 9.8416929245 7.36629199982

В старых версиях Python рекомендуемым способом конкатенации большого количества строк являлось накопление их в списке с последующим применением функции join() (кстати, инкрементная конкатенация почти в восемь раз медленнее этого приема). Начиная с версии 2.4, инкрементная конкатенация была оптимизирована и теперь имеет даже лучший результат, чем версия со списками (которая вдобавок требует больше памяти). Но чемпионом все-таки является работа со списковым включением, поэтому свертывание циклов в списковое включение позволяет повысить эффективность кода.

Если требуются более точные результаты, рекомендуется использовать метод repeat(n, k) - он позволяет вызывать timeit(k) n раз, возвращая список из n значений. Необходимо отметить, что на результаты может влиять загруженность компьютера, на котором проводятся испытания.



Содержание раздела