Mierz czas przetwarzania danych za pomocą modułu timeit Pythona.

Biznes

Używając modułu timeit standardowej biblioteki Pythona, możesz łatwo zmierzyć czas wykonania procesu w swoim kodzie. Jest to przydatne do szybkiego sprawdzenia.

W tym miejscu omówione zostaną dwa następujące przypadki.

  • Pomiar w pliku Pythona:timeit.timeit(),timeit.repeat()
  • Pomiar za pomocą Jupyter Notebook:%timeit,%%timeit

Innym sposobem jest użycie time.time() do zmierzenia czasu, który upłynął w programie.

Pomiary w plikach Pythona: timeit.timeit(), timeit.repeat()

Jako przykład, zmierzymy czas przetwarzania prostej funkcji test(n), która oblicza sumę n kolejnych liczb.

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

Jeśli przekażesz kod, który chcesz zmierzyć jako ciąg znaków do funkcji timeit.timeit(), zostanie on wykonany LICZNĄ ilość razy i zwrócony zostanie czas, jaki to trwało.
Domyślną wartością dla liczby jest 1 000 000. Zauważ, że jeśli użyjesz wartości domyślnej dla czasochłonnego procesu, zajmie to dużo czasu.

Przekazując globals() jako argument globals, kod zostanie wykonany w globalnej przestrzeni nazw.
Bez tego funkcja test i zmienna n nie zostaną rozpoznane w powyższym przykładzie.

Kod, który ma być określony może być obiektem wywoływalnym zamiast łańcucha, więc może być określony jako wyrażenie lambda bez argumentów; w tym przypadku argument globals nie musi być określony.

result = timeit.timeit(lambda: test(n), number=loop)
print(result / loop)
# 0.00027574066299712287

Jednostką wyniku są sekundy. Tutaj wynikiem jest czas przetwarzania na wykonanie podzielony przez liczbę wykonań.

Jeśli nie podzielisz, wartość wyniku będzie się po prostu powiększać wraz ze wzrostem liczby wykonań.

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

Za pomocą funkcji timeit.repeat() można wielokrotnie wykonywać funkcję timeit(). Wynik zostanie otrzymany w postaci listy.

repeat = 5
print(timeit.repeat(lambda: test(n), repeat=repeat, number=100))
# [0.044914519996382296, 0.039663890027441084, 0.02868645201670006, 0.022745631984435022, 0.023260265996214002]

Pomiar za pomocą Jupyter Notebook:%timeit, %%timeit

W Jupyter Notebook (IPython), możesz użyć następujących magicznych poleceń; nie ma potrzeby importowania modułu timeit.

  • %timeit
  • %%timeit

%timeit

W %timeit podaj kod docelowy oddzielony spacją, jak argumenty wiersza poleceń.

Domyślnie, liczba i powtórzenie w timeit.timeit() są określane automatycznie. Możesz je również określić opcjami -n i -r.

Wyniki oblicza się jako średnią i odchylenie standardowe.

%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

Magiczne polecenie %%timeit może być użyte do zmierzenia czasu przetwarzania całej komórki.

Jako przykład, uruchommy ten sam proces używając NumPy. Opcje -n i -r mogą być pominięte.

Ponieważ mierzymy czas przetwarzania całej komórki, w poniższym przykładzie uwzględniono czas importu 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)

Nie ma potrzeby podawania kodu docelowego jako argumentu dla %%timeit. Wszystko, co musisz zrobić, to napisać %%timeit na początku komórki, więc jest to najłatwiejsze w użyciu.

Copied title and URL