Cos'è% timeit in Python?


96

Leggo sempre il codice per calcolare il tempo in questo modo:

%timeit function()

Puoi spiegare cosa significa "%" qui?

Penso che "%" sia sempre usato per sostituire qualcosa in una stringa, come% s significa sostituire una stringa,% d sostituire un dato, ma non ho idea di questo caso.


16
È un comando magico di iPython. Vedi: iPython Magics
MrAlexBailey

Risposte:


91

%timeitè una funzione magica di ipython , che può essere utilizzata per cronometrare un particolare pezzo di codice (una singola istruzione di esecuzione o un singolo metodo).

Dai documenti:

% 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

Per usarlo, ad esempio, se vogliamo scoprire se l'uso xrangeè più veloce dell'uso range, puoi semplicemente fare:

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

E otterrai i tempi per loro.

I principali vantaggi di %timeitsono:

  • che non è necessario importare timeit.timeit dalla libreria standard ed eseguire il codice più volte per capire quale sia l'approccio migliore.

  • % timeit calcolerà automaticamente il numero di esecuzioni richieste per il codice in base a un totale di 2 secondi di finestra di esecuzione.

  • È inoltre possibile utilizzare le variabili della console corrente senza passare l'intero frammento di codice come nel caso in cui si timeit.timeitcompili la variabile creata in un altro ambiente che funziona.


1
c'è un modo per cronometrare una macro o un insieme di righe dalla shell ipython?
alpha_989

2
@ alpha_989 Sì, puoi avvolgere quelle serie di linee all'interno di una funzione, quindi cronometrare la funzione come:%timeit function()
mu 無

@mu 無: Per favore, chiarisci timer.timeit: è il nome effettivo del modulo?
Fountainhead


l'output 10000 loops, best of 3: 29.6 µs per looppuò essere interpretato come: (1.) l'espressione viene eseguita 10000 volte per ottenere il tempo totale (2.) quindi il tempo totale viene diviso per 10000 per ottenere il tempo "per ciclo" e (3.) viene eseguito il calcolo del tempo totale 3 volte e infine (4.) delle 3 volte totali, il tempo totale minimo (noto anche come "migliore di 3") viene utilizzato come output. la mia interpretazione è corretta, sì / no?
Trevor Boyd Smith,

37

Questo è noto come magia di linea in iPython. Sono unici in quanto i loro argomenti si estendono solo alla fine della riga corrente e le magie stesse sono davvero strutturate per lo sviluppo da riga di comando. timeitviene utilizzato per temporizzare l'esecuzione del codice.

Se vuoi vedere tutte le magie che puoi usare, puoi semplicemente digitare:

%lsmagic

per ottenere un elenco sia di line magics che di cell magics.

Alcune ulteriori informazioni magiche dalla documentazione qui :

IPython ha un sistema di comandi che chiamiamo magics che forniscono effettivamente un mini linguaggio di comando ortogonale alla sintassi di Python ed estensibile dall'utente con nuovi comandi. I magici sono pensati per essere digitati in modo interattivo, quindi usano convenzioni della riga di comando, come l'uso di spazi bianchi per separare gli argomenti, trattini per le opzioni e altre convenzioni tipiche di un ambiente a riga di comando.

A seconda che tu sia in modalità linea o cella , ci sono due modi diversi di utilizzare %timeit. La tua domanda illustra il primo modo:

In [1]: %timeit range(100)

vs.

In [1]: %%timeit 
      : x = range(100)
      :


2

Vorrei solo aggiungere un altro utile vantaggio dell'utilizzo di% timeit per rispondere con mu 無che:

  • Puoi anche utilizzare le variabili della console corrente senza passare l'intero frammento di codice come nel caso di timeit.timeit per costruire la variabile che è costruita in un altro ambiente in cui timeit funziona.

PS: So che questo dovrebbe essere un commento a cui rispondere sopra, ma al momento non ho abbastanza reputazione per questo, spero che ciò che scrivo sarà utile a qualcuno e mi aiuti a guadagnare abbastanza reputazione per commentare la prossima volta.


1
Puoi anche modificare la risposta di qualcun altro per migliorarla. Dovresti già avere abbastanza reputazione per questo
Tarick Welling,

Grazie non lo sapevo. @TarickWelling
Ankit Agrawal

2

Volevo solo aggiungere un punto molto sottile su %% timeit. Dato che esegue la "magia" sulla cella , riceverai un errore ...

UsageError: funzione magica di linea %%timeitnon trovata

... se ci sono righe di codice / commento sopra %% timeit. In altre parole, assicurati che %% timeit sia il primo comando nella tua cella.

So che è un piccolo punto su cui diranno tutti gli esperti, ma volevo solo aggiungere il mio mezzo centesimo per i giovani maghi che iniziano con trucchi magici.


1
Questo non è applicabile nella shell iPython, solo in un notebook
Jupyter

0

Le righe magiche hanno il prefisso % e funzionano in modo molto simile alle chiamate della riga di comando del sistema operativo: ottengono come argomento il resto della riga, dove gli argomenti vengono passati senza parentesi o virgolette. Le magie delle celle hanno il prefisso doppio %% e sono funzioni che ottengono come argomento non solo il resto della riga, ma anche le righe sottostanti in un argomento separato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.