Тестування швидкості Python - Різниця в часі - мілісекунди


136

Який правильний спосіб порівняти 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

15
Чому ви не надрукували t2-t1? Що вас заважало відняти?
С.Лотт

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повертає лише частину мікросекунд таймеделі! Для цілей часу завжди використовуйте 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,25s. Насправді, і відповідно до 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.
Контанго

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: ім'я 'час' не визначено
Джо

Вам потрібна 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

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


дивіться другий коментар на рівні запитання.
BuddyJoe

15
"але я знаю, як користуватися Google" - мабуть, все ж, ви не знаєте, як використовувати переповнення стека, адже ціль цього веб-сайту полягає в тому, щоб люди задавали і відповідали на питання програмування правильно і до речі, а не дати хитрощі про те, як "ти міг би замість цього погуглити".
Hejazzman

2

time.time () / datetime хороший для швидкого використання, але не завжди є на 100% точним. З цієї причини мені подобається використовувати один із профілів std lib (особливо хотшот), щоб дізнатися, що до чого.


2

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


2

Ось спеціальна функція, яка імітує функції Матлаба / Октави 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()

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

0

Ви можете використати timeit, як це для тестування сценарію з назвою module.py

$ python -mtimeit -s 'import module'

0

Стрілка: кращі дати та час для 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.