Измерване на времето за обработка с модула timeit на Python.

Бизнес

С помощта на модула 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 в началото на клетката, така че е най-лесен за използване.

Copied title and URL