Тестирование скорости Python - разница во времени - миллисекунды
Как правильно сравнить 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
16 ответов
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.
Начиная с 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
Я знаю, что уже поздно, но мне действительно нравится использовать:
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 секунды.
Вы также можете использовать:
import time
start = time.clock()
do_something()
end = time.clock()
print "%.2gs" % (end-start)
Или вы можете использовать профилировщики Python.
Следующий код должен отображать время детла...
from datetime import datetime
tstart = datetime.now()
# code to speed test
tend = datetime.now()
print tend - tstart
Вы можете посмотреть в профиль модулей. Вы получите лучшее представление о том, где ваши замедления, и большая часть вашей работы будет полностью автоматизирована.
Я не программист на Python, но я знаю, как использовать Google, и вот что я нашел: вы используете оператор "-". Для завершения вашего кода:
from datetime import datetime
tstart = datetime.now()
# code to speed test
tend = datetime.now()
print tend - tstart
Кроме того, похоже, что вы можете использовать функцию strftime(), чтобы отформатировать вычисление временного интервала, чтобы отразить время, которое вас радует.
Стрелка: лучшие даты и время для 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
Вам нужно использовать
time.time()
вместо этого, который выводит время unix с высокой точностью.
Используйте этот код:
from time import time
tstart = time()
doSomething()
tend = time()
diffrence = tend - tstart
print("The doSomething function took {} seconds to execute".format(difference))
Вот пользовательская функция, которая имитирует Matlab's/Octave's 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()
time.time() / datetime хорош для быстрого использования, но не всегда на 100% точен. По этой причине мне нравится использовать один из профилировщиков std lib (особенно hotshot), чтобы выяснить, что к чему.
start = datetime.now()
#code for which response time need to be measured.
end = datetime.now()
dif = end - start
dif_micro = dif.microseconds # time in microseconds
dif_millis = dif.microseconds / 1000 # time in millisseconds
Если кому-то нужно что-то подобное, например, для анализа задержек между записями журнала ... и т. Д.
def get_time_diff_between_timestruct_tuples(timestruct_tuples):
"""
expecting input like:
[(0, datetime.datetime(2021, 10, 27, 16, 6, 8, 590892)),
(1, datetime.datetime(2021, 10, 27, 16, 6, 8, 591833)),
(2, datetime.datetime(2021, 10, 27, 16, 6, 9, 434053)),
(3, datetime.datetime(2021, 10, 27, 16, 6, 9, 878021)), ...]
output like:
[0.941, 0.84222, 0.443968, ...]
"""
def seconds_mms_diff(t0, t1):
diff = t1 - t0
s = diff.seconds
mms = diff.microseconds
return float(f"{s}.{mms}")
timediffs = []
init = timestruct_tuples[0][1]
idx = 0
while idx < (len(timestruct_tuples)-1):
timediffs.append(seconds_mms_diff(init, timestruct_tuples[idx+1][1]))
idx += 1
init = timestruct_tuples[idx][1]
return timediffs
Вы можете использовать timeit вот так, чтобы протестировать скрипт с именем module.py
$ python -mtimeit -s 'import module'