Тестирование скорости Python - разница во времени - миллисекунды


136

Как правильно сравнить 2 раза в Python, чтобы ускорить тестирование фрагмента кода? Я пробовал читать документы API. Я не уверен, что понимаю, что такое timedelta.

Пока у меня есть этот код:

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
Почему вы не напечатали t2-t1? Что мешало вам вычитать?
S.Lott

18
Думаю, у меня был момент «это не могло быть так просто».
BuddyJoe,

Ответы:


191

datetime.timedelta это просто разница между двумя датами ... так что это как период времени в днях / секундах / микросекундах

>>> 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

Имейте c.microsecondsв виду, что timedelta возвращает только микросекунды! Для расчета времени всегда используйтеc.total_seconds() .

С помощью datetime.timedelta вы можете выполнять всевозможные математические операции, например:

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

Возможно, было бы полезнее посмотреть на время процессора, а не на время настенных часов ... хотя это зависит от операционной системы ... в Unix-подобных системах проверьте команду 'time'.


Любой, кто заинтересован в получении общего количества минут, может использовать int(c.total_seconds() / 60)в этом случае
sufinawaz

2
На странице модуля timeit говорится, что модуль «избегает ряда распространенных ловушек для измерения времени выполнения». Подвержен ли этот подход (с использованием datetime.now) какой-либо из этих ловушек?
kuzzooroo

@kuzzooroo да, это так! Лучше вместо этого метода использовать timeit! Например, у меня есть тест в большом проекте Python, который при измерении с использованием этого метода дает предполагаемое время выполнения 0,25 с. На самом деле, и согласно timeit, время выполнения указанной функции составляет 30 секунд!
kazaamjt

62

Начиная с Python 2.7 существует метод timedelta.total_seconds (). Итак, чтобы получить прошедшие миллисекунды:

>>> 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

Вы также можете использовать:

import time

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

Или вы можете использовать профилировщики Python .


1
При использовании start = time.clock()печатает 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,

16

Я знаю, что это поздно, но мне действительно нравится использовать:

import time
start = time.time()

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

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

time.time()дает вам секунды с эпохи. Поскольку это стандартное время в секундах, вы можете просто вычесть время начала из времени окончания, чтобы получить время процесса (в секундах). time.clock()это хорошо для тестирования, но я нашел его бесполезным, если вы хотите знать, сколько времени занял ваш процесс. Например, гораздо более интуитивно понятно, что «мой процесс занимает 10 секунд», чем сказать, что «мой процесс занимает 10 тактовых блоков процессора».

>>> 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

В первом примере, приведенном выше, вам показано время 0,05 для time.clock () против 0,06377 для 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

Во втором примере как-то время процессора показывает «0», хотя процесс спит секунду. time.time()правильно показывает чуть больше 1 секунды.


NameError: имя 'time' не определено
Джо

Вам нужно import timeзаявление
mgoldwasser

5

Следующий код должен отображать время детла ...

from datetime import datetime

tstart = datetime.now()

# code to speed test

tend = datetime.now()
print tend - tstart

4

Вы можете просто распечатать разницу:

print tend - tstart

4

Я не программист на Python, но я знаю, как использовать Google, и вот что я обнаружил: вы используете оператор «-». Для завершения вашего кода:

from datetime import datetime

tstart = datetime.now()

# code to speed test

tend = datetime.now()
print tend - tstart

Кроме того, похоже, что вы можете использовать функцию strftime () для форматирования расчета временного интервала, чтобы отобразить время, но это вас радует.


см. второй комментарий на уровне вопроса.
BuddyJoe,

15
«но я знаю, как использовать Google» - очевидно, вы не знаете, как использовать переполнение стека, потому что вся цель этого веб-сайта в том, чтобы люди задавали и отвечали на вопросы по программированию правильно и точно, а не чтобы вспомнить о том, что «ты мог бы вместо этого изумлённый взгляд».
Hejazzman

Я попал сюда через гугл :)
Джейми Кук

2

time.time () / datetime хорош для быстрого использования, но не всегда на 100% точен. По этой причине мне нравится использовать один из профилировщиков std lib (особенно hotshot), чтобы узнать, что к чему.


2

Вы можете изучить модули профиля . Вы лучше поймете, где у вас замедление, и большая часть вашей работы будет полностью автоматизирована.


2

Вот пользовательская функция, которая имитирует Matlab / Octave tic toc .

Пример использования:

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')

Функция:

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()

Отслеживание (последний вызов последним): файл "redis-get-response.py", строка 22, в <module> time_var = time_me (); # получить переменную с текущей меткой времени Файл "redis-get-response.py", строка 20, в time_me вернуть time.time () NameError: имя 'time' не определено
Джо,

0

Вы можете использовать timeit вот так, чтобы протестировать скрипт с именем module.py

$ python -mtimeit -s 'import module'

0

Arrow: лучшие даты и время для 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.