Тестирование скорости 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

Возможно, вы захотите использовать модуль timeit.

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

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(), чтобы отформатировать вычисление временного интервала, чтобы отразить время, которое вас радует.

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

print tend - tstart

Стрелка: лучшие даты и время для 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 tictoc функции.

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

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'
Другие вопросы по тегам