O que é% timeit em python?

99

Eu sempre leio o código para calcular o tempo desta forma:

%timeit function()

Você pode explicar o que significa "%" aqui?

Acho que o "%" sempre é usado para substituir algo em uma string, como% s significa substituir uma string,% d substituir um dado, mas não tenho ideia sobre este caso.

xirururu
fonte
16
Esse é um comando mágico do iPython. Veja: iPython Magics
MrAlexBailey

Respostas:

94

%timeité uma função mágica do ipython , que pode ser usada para cronometrar uma parte específica do código (uma única instrução de execução ou um único método).

Dos documentos:

% 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

Para usá-lo, por exemplo, se quisermos descobrir se usar xrangeé mais rápido do que usar range, você pode simplesmente fazer:

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 você obterá os horários para eles.

As principais vantagens %timeitsão:

  • que você não precisa importar timeit.timeit da biblioteca padrão e executar o código várias vezes para descobrir qual é a melhor abordagem.

  • % timeit calculará automaticamente o número de execuções necessárias para seu código com base em uma janela de execução de 2 segundos no total.

  • Você também pode fazer uso das variáveis ​​de console atuais sem passar o trecho de código inteiro, como no caso de timeit.timeitconstruir a variável que é construída em outro ambiente em que o timeit funciona.

mu 無
fonte
1
existe uma maneira de cronometrar uma macro ou um conjunto de linhas do shell do ipython?
alpha_989
2
@ alpha_989 Sim, você pode agrupar esse conjunto de linhas em uma função e, em seguida, cronometrar a função como:%timeit function()
mu 無
@mu 無: Esclareça timer.timeit- esse é um nome de módulo real?
nascente de
2
@fountainhead: docs.python.org/3/library/timeit.html#timeit.timeit
Sasha Chedygov
a saída 10000 loops, best of 3: 29.6 µs per looppode ser interpretada como: (1.) a expressão é executada 10.000 vezes para obter o tempo total (2.) então o tempo total é dividido por 10.000 para obter o tempo "por loop" e (3.) o cálculo do tempo total é feito 3 vezes e finalmente (4) do total de 3 vezes, o tempo total mínimo (também conhecido como "melhor de 3") é usado como saída. minha interpretação está correta, sim / não?
Trevor Boyd Smith de
39

Isso é conhecido como mágica de linha no iPython. Eles são únicos no sentido de que seus argumentos se estendem apenas até o final da linha atual, e as próprias magias são realmente estruturadas para o desenvolvimento de linha de comando. timeité usado para cronometrar a execução do código.

Se você quiser ver todas as magias que pode usar, basta digitar:

%lsmagic

para obter uma lista de magias de linha e magia celular.

Mais algumas informações mágicas da documentação aqui :

O IPython tem um sistema de comandos que chamamos de mágicos que fornecem efetivamente uma linguagem de mini comandos que é ortogonal à sintaxe do Python e é extensível pelo usuário com novos comandos. Magics são feitos para serem digitados interativamente, então eles usam convenções de linha de comando, como usar espaços em branco para separar argumentos, travessões para opções e outras convenções típicas de um ambiente de linha de comando.

Dependendo se você está no modo linha ou célula , existem duas maneiras diferentes de usar %timeit. Sua pergunta ilustra a primeira maneira:

In [1]: %timeit range(100)

vs.

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

Eu só queria acrescentar um ponto muito sutil sobre %% timeit. Dado que executa a "magia" no celular , você obterá erro ...

UsageError: Função mágica de linha %%timeitnão encontrada

... se houver alguma linha de código / comentário acima de %% timeit. Em outras palavras, certifique-se de que %% timeit seja o primeiro comando em sua célula.

Eu sei que é um pequeno ponto que todos os especialistas dirão duh, mas eu só queria adicionar meu meio centavo para os jovens bruxos que estão começando com truques de mágica.

sucesso
fonte
1
Isso não é aplicável no shell do iPython, apenas em um notebook
Jupyter
2

Eu gostaria apenas de adicionar outra vantagem útil de usar% timeit para responder por mu 無que:

  • Você também pode usar as variáveis ​​de console atuais sem passar todo o trecho de código como no caso de timeit.timeit para construir a variável que é construída em outro ambiente em que o timeit funciona.

PS: Eu sei que este deve ser um comentário a ser respondido acima, mas atualmente não tenho reputação suficiente para isso, espero que o que escrevo seja útil para alguém e me ajude a ganhar reputação suficiente para comentar na próxima vez.

Ankit Agrawal
fonte
1
Você também pode editar a resposta de outra pessoa para melhorá-la. Você já deve ter reputação suficiente para isso
Tarick Welling
Obrigado não sabia disso. @TarickWelling
Ankit Agrawal
0

Magias de linha são prefixadas com o caractere % e funcionam muito como chamadas de linha de comando do sistema operacional: elas obtêm como argumento o resto da linha, onde os argumentos são passados ​​sem parênteses ou aspas. Cell magics são prefixados com %% duplo , e são funções que obtêm como argumento não apenas o resto da linha, mas também as linhas abaixo dela em um argumento separado.

Mohammad Salehi
fonte