Тестирование скорости Python - разница во времени - миллисекунды - PullRequest
114 голосов
/ 20 апреля 2009

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

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

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

Ответы [ 12 ]

162 голосов
/ 20 апреля 2009

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

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

45 голосов
/ 18 июня 2014

Начиная с 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
35 голосов
/ 20 апреля 2009

Вместо этого вы можете использовать модуль timeit .

19 голосов
/ 20 апреля 2009

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

import time

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

Или вы можете использовать Python Profiler .

12 голосов
/ 16 мая 2014

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

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 секунды.

4 голосов
/ 20 апреля 2009

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

print tend - tstart
3 голосов
/ 20 апреля 2009

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

from datetime import datetime

tstart = datetime.now()

# code to speed test

tend = datetime.now()
print tend - tstart
2 голосов
/ 20 октября 2016

Вот пользовательская функция, которая имитирует функции 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()
2 голосов
/ 20 апреля 2009

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

2 голосов
/ 20 апреля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...