Co to jest% timeit w Pythonie?

100

Kod zawsze czytam, żeby obliczyć czas w ten sposób:

%timeit function()

Czy możesz wyjaśnić, co oznacza tutaj „%”?

Myślę, że „%” jest zawsze używany do zastąpienia czegoś w ciągu, na przykład% s oznacza zastąpienie ciągu,% d zastąpienie danych, ale nie mam pojęcia o tym przypadku.

xirururu
źródło
16
To magiczne polecenie z iPythona. Zobacz: iPython Magics
MrAlexBailey

Odpowiedzi:

95

%timeitto magiczna funkcja ipython , której można użyć do określenia czasu określonego fragmentu kodu (pojedyncza instrukcja wykonania lub pojedyncza metoda).

Z dokumentów:

% timeit

Time execution of a Python statement or expression

Usage, in line mode:
    %timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] statement

Aby z niego skorzystać, na przykład jeśli chcemy dowiedzieć się, czy używanie xrangejest szybsze niż używanie range, możesz po prostu zrobić:

In [1]: %timeit for _ in range(1000): True
10000 loops, best of 3: 37.8 µs per loop

In [2]: %timeit for _ in xrange(1000): True
10000 loops, best of 3: 29.6 µs per loop

Otrzymasz dla nich czasy.

Głównymi zaletami %timeitsą:

  • że nie musisz importować timeit.timeit ze standardowej biblioteki i uruchamiać kod wiele razy, aby dowiedzieć się, które jest lepsze.

  • % timeit automatycznie obliczy liczbę uruchomień wymaganych dla twojego kodu na podstawie łącznie 2-sekundowego okna wykonywania.

  • Możesz także użyć bieżących zmiennych konsoli bez przekazywania całego fragmentu kodu, jak w przypadku tworzenia timeit.timeitzmiennej, która jest zbudowana w innym środowisku, które działa.

mu 無
źródło
1
czy istnieje sposób na czasowe ustawienie makra lub zestawu linii z powłoki ipython?
alpha_989
2
@ alpha_989 Tak, możesz zawijać ten zestaw wierszy w funkcji, a następnie ustawić czas dla funkcji, na przykład:%timeit function()
mu 無
@mu 無: Proszę wyjaśnić timer.timeit- czy to rzeczywista nazwa modułu?
fontanna
2
@fountainhead: docs.python.org/3/library/timeit.html#timeit.timeit
Sasha Chedygov
wynik 10000 loops, best of 3: 29.6 µs per loopmożna zinterpretować jako: (1.) wyrażenie jest uruchamiane 10000 razy, aby uzyskać całkowity czas (2.) następnie całkowity czas jest dzielony przez 10000, aby uzyskać czas „na pętlę” i (3.) obliczenie całkowitego czasu 3 razy i na koniec (4.) z 3 całkowitych czasów, minimalny łączny czas (aka „najlepsza z 3”) jest używany jako wynik. czy moja interpretacja jest prawidłowa, tak / nie?
Trevor Boyd Smith
39

Jest to znane jako magia linii w iPythonie. Są wyjątkowe, ponieważ ich argumenty rozciągają się tylko do końca bieżącej linii, a sama magia jest tak naprawdę skonstruowana pod kątem rozwoju wiersza poleceń. timeitsłuży do mierzenia czasu wykonania kodu.

Jeśli chcesz zobaczyć całą magię, której możesz użyć, możesz po prostu wpisać:

%lsmagic

aby uzyskać listę zarówno magii liniowej, jak i magii komórkowej.

Kilka dodatkowych magicznych informacji z dokumentacji tutaj :

IPython ma system poleceń, które nazywamy magią, które zapewniają efektywny język mini poleceń, który jest ortogonalny do składni Pythona i może być rozszerzany przez użytkownika za pomocą nowych poleceń. Magiki mają być pisane interaktywnie, więc używają konwencji wiersza poleceń, takich jak używanie białych znaków do oddzielania argumentów, myślników dla opcji i innych konwencji typowych dla środowiska wiersza poleceń.

W zależności od tego, czy jesteś w trybie liniowym, czy komórkowym , istnieją dwa różne sposoby użycia %timeit. Twoje pytanie ilustruje pierwszy sposób:

In [1]: %timeit range(100)

vs.

In [1]: %%timeit 
      : x = range(100)
      :
miradulo
źródło
3

Chciałem tylko dodać bardzo subtelny punkt dotyczący %% timeit. Biorąc pod uwagę, że uruchamia „magię” komórki , pojawi się błąd ...

UsageError: %%timeitNie znaleziono funkcji magicznej linii

... jeśli są jakieś linie kodu / komentarza powyżej %% timeit. Innymi słowy, upewnij się, że %% timeit jest pierwszym poleceniem w Twojej komórce.

Wiem, że to drobiazg, o którym mówią wszyscy eksperci, ale chciałem tylko dodać moje pół centa dla młodych czarodziejów zaczynających od magicznych sztuczek.

udany
źródło
1
To nie ma zastosowania w ipython powłoki, tylko w zeszycie Jupyter
snakecharmerb
2

I Chciałbym tylko dodać kolejną użyteczną zaletę używania% timeit aby odpowiedzieć przez MU無że:

  • Możesz także użyć bieżących zmiennych konsoli bez przekazywania całego fragmentu kodu, jak w przypadku timeit.timeit, aby zbudować zmienną, która jest zbudowana w innym środowisku, w którym działa czas.

PS: Wiem, że to powinien być komentarz, aby odpowiedzieć powyżej, ale obecnie nie mam wystarczającej reputacji, mam nadzieję, że to, co piszę, okaże się komuś pomocne i pomoże mi zdobyć wystarczającą reputację, aby móc komentować następnym razem.

Ankit Agrawal
źródło
1
Możesz także edytować odpowiedź innej osoby, aby ją poprawić. Powinieneś już mieć wystarczającą reputację
Tarick Welling
Dzięki nie wiedziałem o tym. @TarickWelling
Ankit Agrawal
0

Magia linii jest poprzedzona znakiem % i działa podobnie jak wywołania wiersza poleceń systemu operacyjnego: otrzymują jako argument pozostałą część linii, gdzie argumenty są przekazywane bez nawiasów ani cudzysłowów. Magie komórkowe są poprzedzone podwójnym %% i są to funkcje, które jako argument pobierają nie tylko resztę wiersza, ale także wiersze poniżej w osobnym argumencie.

Mohammad Salehi
źródło