2014-02-12 5 views
0

Я пытаюсь получить разницу между двумя временами для тестирования производительности какого-либо кода. Во-первых, я получаю локальное время в среде. Запустите код, который будет проверен первыми, а затем снова получите местное время. После этого я вычитаю время, чтобы посмотреть, сколько времени прошло испытание. Я стараюсь быть точным до минут, секунд и микросекунд.
Я нахожу интересным, что это работает, если я поставил печать каждый раз после я получаю время:разница между двумя

startTest= datetime.datetime.now() 
print startTest 

я получаю:

TotalTime: 0:00:00.328000 

Однако терпит неудачу, если я не добавлять никаких заявлений печати после я получить местное время, это то, что им делать:

import datetime 

startTest= datetime.datetime.now() 
 #Code to be Tested# 
endTest= datetime.datetime.now() 
testTime = endTest - startTest 
print 'TotalTime: ',testTime 

Это дает мне следующий вывод:

TotalTime: 0:00:00 

любая идея, как заставить его распечатать на формате 0:00:00.000000?

+0

Я не могу воспроизвести это, что такое точная версия Python? –

+0

загляните в python cProfile module ... и или модуль timeit .... –

+0

Я согласен, довольно странно! я бегу 2.7.1 – user3291939

ответ

1

Это не прямо ответить на ваш вопрос, но вы могли бы посмотреть на питонов timeit модуль http://docs.python.org/2/library/timeit.html , который предназначен для тестирования производительности небольших фрагментов кода.

0

Он печатает микросекунды только в том случае, если в атрибуте microseconds объекта есть ненулевое значение.

Если вы хотите другое поведение, напишите свою собственную функцию форматирования строк. Нечто подобное:

def delta_to_string(tdelta): 
    return '%s days, %02d:%02d:%09.6f' % (
     tdelta.days, 
     tdelta.seconds/3600, 
     (tdelta.seconds/60) % 60, 
     (tdelta.seconds % 60) + (tdelta.microseconds/10**6.)) 

Формат %09.6f означает общее для поплавка в том числе десятичной 9 цифр, добавьте ведущие 0s, при необходимости, 6 цифр макс для десятичной части. Если вам нужно больше или меньше цифр, вам необходимо изменить как общее количество цифр, так и десятичную часть - 10 знаков после запятой будут %013.10f.

Это печатает каждую часть объекта timedelta. Давайте попробуем:

>>> delta_to_string((datetime.datetime.now() - datetime.datetime.now())) 
'0 days, 00:00:00.000000' 

Я думаю, что вы хотели бы сохранить функциональность не печатает дней, если дни 0 ...

def delta_to_string(tdelta): 
    return '%s%02d:%02d:%09.6f' % (
     ('%s days, ' % tdelta.days) if tdelta.days else '', 
     tdelta.seconds/3600, 
     (tdelta.seconds/60) % 60, 
     (tdelta.seconds % 60) + (tdelta.microseconds/10**6.)) 

Теперь результаты:

>>> s1 = datetime.datetime.now() 
>>> s2 = datetime.datetime.now() 
>>> delta_to_string(s1 - s2) 
'-1 days, 23:59:57.387000' 
>>> print (s1 - s2) 
-1 day, 23:59:57.387000 
>>> delta_to_string(s2 - s1) 
'00:00:02.613000' 
>>> print (s2 - s1) 
0:00:02.613000 
>>> delta_to_string(s2 - s2) 
'00:00:00.000000' 
>>> print (s2 - s2) 
0:00:00 

Doesn 't вести себя так же, как встроенная функция str ... Я оставлю различия как «упражнение для читателя».

Смежные вопросы