Тестування швидкості 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.