Teste de velocidade do Python - Diferença de tempo - milissegundos


136

Qual é a maneira correta de comparar duas vezes no Python para acelerar o teste de uma seção do código? Eu tentei ler os documentos da API. Não sei se entendi a coisa do timedelta.

Até agora eu tenho este código:

from datetime import datetime

tstart = datetime.now()
print t1

# code to speed test

tend = datetime.now()
print t2
# what am I missing?
# I'd like to print the time diff here

15
Por que você não imprimiu t2-t1? O que o impediu de subtrair?
S.Lott

18
Acho que tive o momento "não poderia ser tão fácil".
BuddyJoe

Respostas:


191

datetime.timedelta é apenas a diferença entre duas datas ... então é como um período de tempo, em dias / segundos / microssegundos

>>> import datetime
>>> a = datetime.datetime.now()
>>> b = datetime.datetime.now()
>>> c = b - a

>>> c
datetime.timedelta(0, 4, 316543)
>>> c.days
0
>>> c.seconds
4
>>> c.microseconds
316543

Esteja ciente de que c.microsecondsapenas retorna a parte de microssegundos da timedelta! Para fins de tempo, use sempre c.total_seconds().

Você pode fazer todo tipo de matemática com datetime.timedelta, por exemplo:

>>> c / 10
datetime.timedelta(0, 0, 431654)

Pode ser mais útil observar o tempo da CPU em vez do tempo do relógio de parede ... embora isso seja dependente do sistema operacional ... em sistemas do tipo Unix, verifique o comando 'time'.


Quem estiver interessado em obter o total de minutos pode usar int(c.total_seconds() / 60)neste caso
sufinawaz

2
A página do módulo timeit diz que o módulo "evita vários desvios comuns para medir os tempos de execução". Essa abordagem (usando datetime.now) está sujeita a alguma dessas armadilhas?
precisa saber é o seguinte

@kuzzooroo sim, é! É melhor usar timeit em vez deste método! Por exemplo, eu tenho um teste em um projeto python grande que, quando medido usando esse método, resulta em um suposto tempo de execução de 0,25s. Na realidade, e de acordo com o timeit, o tempo de execução da referida função é na verdade 30 segundos!
kazaamjt

62

Desde o Python 2.7, existe o método timedelta.total_seconds (). Portanto, para obter os milissegundos decorridos:

>>> import datetime
>>> a = datetime.datetime.now()
>>> b = datetime.datetime.now()
>>> delta = b - a
>>> print delta
0:00:05.077263
>>> int(delta.total_seconds() * 1000) # milliseconds
5077


20

Você também pode usar:

import time

start = time.clock()
do_something()
end = time.clock()
print "%.2gs" % (end-start)

Ou você pode usar os criadores de perfil python .


1
Ao usá- start = time.clock()lo, imprime DeprecationWarning: time.clock has been deprecated in Python 3.3 and will be removed from Python 3.8: use time.perf_counter or time.process_time instead.
Contango 21/07

16

Eu sei que é tarde, mas eu realmente gosto de usar:

import time
start = time.time()

##### your timed code here ... #####

print "Process time: " + (time.time() - start)

time.time()dá-lhe segundos desde a época. Como esse é um tempo padronizado em segundos, você pode simplesmente subtrair o horário inicial do horário final para obter o tempo do processo (em segundos). time.clock()é bom para o benchmarking, mas achei inútil se você quiser saber quanto tempo levou o processo. Por exemplo, é muito mais intuitivo dizer "meu processo leva 10 segundos" do que dizer "meu processo leva 10 unidades de clock do processador"

>>> start = time.time(); sum([each**8.3 for each in range(1,100000)]) ; print (time.time() - start)
3.4001404476250935e+45
0.0637760162354
>>> start = time.clock(); sum([each**8.3 for each in range(1,100000)]) ; print (time.clock() - start)
3.4001404476250935e+45
0.05

No primeiro exemplo acima, é mostrado um tempo de 0,05 para time.clock () vs 0,06377 para time.time ()

>>> start = time.clock(); time.sleep(1) ; print "process time: " + (time.clock() - start)
process time: 0.0
>>> start = time.time(); time.sleep(1) ; print "process time: " + (time.time() - start)
process time: 1.00111794472

No segundo exemplo, de alguma forma, o tempo do processador mostra "0", mesmo que o processo tenha dormido por um segundo. time.time()mostra corretamente um pouco mais de 1 segundo.


NameError: o nome 'time' não está definido
Joe

Você precisa da import timedeclaração
mgoldwasser

5

O código a seguir deve exibir o tempo detalhado ...

from datetime import datetime

tstart = datetime.now()

# code to speed test

tend = datetime.now()
print tend - tstart

4

Você pode simplesmente imprimir a diferença:

print tend - tstart

4

Eu não sou um programador Python, mas sei como usar o Google e eis o que encontrei: você usa o operador "-". Para completar seu código:

from datetime import datetime

tstart = datetime.now()

# code to speed test

tend = datetime.now()
print tend - tstart

Além disso, parece que você pode usar a função strftime () para formatar o cálculo do intervalo de tempo para renderizar o horário, no entanto, o deixa feliz.


veja o segundo comentário no nível da pergunta.
BuddyJoe

15
"mas eu sei como usar o Google" - aparentemente, você não sabe como usar o Stack Overflow, porque todo o objetivo deste site é que as pessoas façam e respondam perguntas de programação corretamente e até o ponto, não para falar mal de como "você poderia usar o Goggled".
Hejazzman

2

time.time () / datetime é bom para uso rápido, mas nem sempre é 100% preciso. Por esse motivo, gosto de usar um dos criadores de perfil std lib (especialmente o hotshot) para descobrir o que é o quê.


2

Você pode querer examinar os módulos de perfil . Você obterá uma melhor leitura de onde estão suas lentidão e grande parte do seu trabalho será totalmente automatizada.


2

Aqui está uma função personalizada que imita as funções do Matlab / Octave tic toc.

Exemplo de uso:

time_var = time_me(); # get a variable with the current timestamp

... run operation ...

time_me(time_var); # print the time difference (e.g. '5 seconds 821.12314 ms')

Função:

def time_me(*arg):
    if len(arg) != 0: 
        elapsedTime = time.time() - arg[0];
        #print(elapsedTime);
        hours = math.floor(elapsedTime / (60*60))
        elapsedTime = elapsedTime - hours * (60*60);
        minutes = math.floor(elapsedTime / 60)
        elapsedTime = elapsedTime - minutes * (60);
        seconds = math.floor(elapsedTime);
        elapsedTime = elapsedTime - seconds;
        ms = elapsedTime * 1000;
        if(hours != 0):
            print ("%d hours %d minutes %d seconds" % (hours, minutes, seconds)) 
        elif(minutes != 0):
            print ("%d minutes %d seconds" % (minutes, seconds))
        else :
            print ("%d seconds %f ms" % (seconds, ms))
    else:
        #print ('does not exist. here you go.');
        return time.time()

Traceback (última chamada mais recente): arquivo "redis-get-response.py", linha 22, em <module> time_var = time_me (); # obtém uma variável com o registro de data e hora atual O arquivo "redis-get-response.py", linha 20, em time_me retorna time.time () NameError: name 'time' não está definido
Joe

0

Você pode usar timeit como este para testar um script chamado module.py

$ python -mtimeit -s 'import module'

0

Arrow: Melhores datas e horários para Python

import arrow
start_time = arrow.utcnow()
end_time = arrow.utcnow()
(end_time - start_time).total_seconds()  # senconds
(end_time - start_time).total_seconds() * 1000  # milliseconds
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.