С помощта на модула timeit от стандартната библиотека на Python можете лесно да измервате времето за изпълнение на даден процес в кода си. Това е полезно за бърза проверка.
Тук ще бъдат разгледани следните два случая.
- Мярка във файл на Python:
timeit.timeit()
,timeit.repeat()
- Измерване с Jupyter Notebook:
%timeit
,%%timeit
Друг начин е да използвате time.time(), за да измерите изминалото време в програмата.
Измервания във файлове на Python: timeit.timeit(), timeit.repeat()
Като пример ще измерим времето за обработка на една проста функция, test(n), която изчислява сумата на n последователни числа.
import timeit
def test(n):
return sum(range(n))
n = 10000
loop = 1000
result = timeit.timeit('test(n)', globals=globals(), number=loop)
print(result / loop)
# 0.0002666301020071842
Ако подадете кода, който искате да измерите, като низ към функцията timeit.timeit(), той ще бъде изпълнен БРОЙ пъти и ще бъде върнато времето, което е отнел.
Стойността по подразбиране за числото е 1 000 000. Имайте предвид, че ако използвате стойността по подразбиране за процес, който отнема много време, той ще отнеме много време.
Като подадете globals() като аргумент globals, кодът ще бъде изпълнен в глобалното пространство от имена.
Без това функцията test и променливата n не се разпознават в примера по-горе.
Кодът, който трябва да бъде зададен, може да бъде обект, който може да бъде извикан, а не низ, така че може да бъде зададен като ламбда израз без аргументи; в този случай не е необходимо да се посочва аргументът globals.
result = timeit.timeit(lambda: test(n), number=loop)
print(result / loop)
# 0.00027574066299712287
Единицата за резултата е секунда. Тук резултатът е времето за обработка на едно изпълнение, разделено на броя на изпълненията.
Ако не разделите, стойността на резултата просто ще стане по-голяма при увеличаване на броя на изпълненията.
print(timeit.timeit(lambda: test(n), number=1))
print(timeit.timeit(lambda: test(n), number=10))
print(timeit.timeit(lambda: test(n), number=100))
# 0.0003999490290880203
# 0.0038685189792886376
# 0.03517670702422038
С помощта на функцията timeit.repeat() функцията timeit() може да се изпълнява многократно. Резултатът ще бъде получен като списък.
repeat = 5
print(timeit.repeat(lambda: test(n), repeat=repeat, number=100))
# [0.044914519996382296, 0.039663890027441084, 0.02868645201670006, 0.022745631984435022, 0.023260265996214002]
Измерване с Jupyter Notebook:%timeit, %%timeit
В Jupyter Notebook (IPython) можете да използвате следните магически команди; не е необходимо да импортирате модула timeit.
%timeit
%%timeit
%timeit
В %timeit посочете целевия код, отделен с интервал, както при аргументите от командния ред.
По подразбиране числото и повторението в timeit.timeit() се определят автоматично. Можете да ги зададете и с опциите -n и -r.
Резултатите са изчислени като средна стойност и стандартно отклонение.
%timeit test(n)
# 259 µs ± 4.87 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit -r 3 -n 10000 test(n)
# 237 µs ± 6.44 µs per loop (mean ± std. dev. of 3 runs, 10000 loops each)
%%timeit
Магическата команда %%timeit може да се използва за измерване на времето за обработка на цяла клетка.
Като пример, нека изпълним същия процес с помощта на NumPy. Опциите -n и -r могат да бъдат пропуснати.
Тъй като измерваме времето за обработка на цялата клетка, следващият пример включва времето за импортиране на NumPy.
%%timeit -r 3 -n 10000
import numpy as np
a = np.arange(n)
np.sum(a)
# 19.7 µs ± 9.57 µs per loop (mean ± std. dev. of 3 runs, 10000 loops each)
Не е необходимо да посочвате целевия код като аргумент за %%timeit. Всичко, което трябва да направите, е да напишете %%timeit в началото на клетката, така че е най-лесен за използване.