Як виміряти час між рядками коду в python?


98

Отже, на Java ми можемо зробити Як виміряти час, який виконується функцією

Але як це робиться в python? Щоб виміряти час початку та кінця часу між рядками кодів? Щось, що робить це:

import some_time_library

starttime = some_time_library.some_module()
code_tobe_measured() 
endtime = some_time_library.some_module()

time_taken = endtime - starttime

Відповіді:


150

Якщо ви хочете виміряти час процесора, можете використовувати time.process_time()для Python 3.3 і вище:

import time
start = time.process_time()
# your code here    
print(time.process_time() - start)

Перший дзвінок включає таймер, а другий дзвінок повідомляє, скільки секунд минуло.

Існує також функція time.clock(), але вона застаріла з Python 3.3 і буде вилучена в Python 3.8.

Є кращі інструменти профілювання, такі як timeitі profile, однак time.process_time () буде вимірювати час процесора, і це те, про що ви запитуєте.

Якщо ви хочете заміряти час настінного годинника, використовуйте time.time().


52
Це не те, як ви використовуєте time.clock(), і time.clock()вимірює час процесора в Unix, а час стіни в Windows. Краще використовувати time.time()там, де поведінка не залежить від ОС. stackoverflow.com/questions/85451/…
Тім,

4
Гарне спостереження, @Tim. Однак інша публікація з того самого питання цитує python doc за time.clock (), що "це функція, яка використовується для порівняльного тестування Python або алгоритмів синхронізації". Я думаю, це стосується питання, що ви насправді хочете виміряти.
Євген Ямпольський

1
Дуже погана річ у time.time () полягає в тому, що на нього впливає синхронізація часу ntpdate тощо. Я б сказав, що time.clock () буде єдиною надійною альтернативою через це
www.jensolsson.se

4
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
ismailarilik

2
Мда ... не впевнений, що я роблю не так. Я замінив # your code hereна time.sleep(10)і отримав 0,0 секунди. Додавання for i in range(10000):/passдало ті самі результати. За будь-яких обставин, які я намагався, time.process_time()завжди повертається однаковий номер. Я отримав очікувані результати, використовуючи, time.perf_counter()однак
biscuit314

56

Ви також можете використовувати timeбібліотеку:

import time

start = time.time()

# your code

# end

print(f'Time: {time.time() - start}')

1
@Hayat - Цей метод повертає час у вигляді числа з плаваючою комою, вираженого в секундах від епохи, в UTC. [ docs.python.org/3/library/time.html]
Анумой Сутрадхар

@AnumoySutradhar насправді не так, оскільки він віднімає епоху від епохи, ви отримуєте різницю в часі між цими двома часами.
Наста

28

За допомогою невеликого класу зручності ви можете виміряти час, проведений у відступах так:

with CodeTimer():
   line_to_measure()
   another_line()
   # etc...

Що покаже наступне після завершення виконання відступів:

Code block took: x.xxx ms

ОНОВЛЕННЯ: Тепер ви можете отримати клас за допомогою, pip install linetimerа потім from linetimer import CodeTimer. Дивіться цей проект GitHub .

Код для вищезазначеного класу:

import timeit

class CodeTimer:
    def __init__(self, name=None):
        self.name = " '"  + name + "'" if name else ''

    def __enter__(self):
        self.start = timeit.default_timer()

    def __exit__(self, exc_type, exc_value, traceback):
        self.took = (timeit.default_timer() - self.start) * 1000.0
        print('Code block' + self.name + ' took: ' + str(self.took) + ' ms')

Потім ви можете назвати блоки коду, які потрібно виміряти:

with CodeTimer('loop 1'):
   for i in range(100000):
      pass

with CodeTimer('loop 2'):
   for i in range(100000):
      pass

Code block 'loop 1' took: 4.991 ms
Code block 'loop 2' took: 3.666 ms

І гнізди їх:

with CodeTimer('Outer'):
   for i in range(100000):
      pass

   with CodeTimer('Inner'):
      for i in range(100000):
         pass

   for i in range(100000):
      pass

Code block 'Inner' took: 2.382 ms
Code block 'Outer' took: 10.466 ms

Що стосується timeit.default_timer(), він використовує найкращий таймер на основі ОС та версії Python, див. Цю відповідь .


10

Я завжди волію перевіряти час у годинах, хвилинах та секундах (% H:% M:% S) формат:

from datetime import datetime
start = datetime.now()
# your code
end = datetime.now()
time_taken = end - start
print('Time: ',time_taken) 

вихід:

Time:  0:00:00.000019

3

Я шукав спосіб, як вивести відформатований час із мінімальним кодом, тому ось моє рішення. Багато людей у ​​будь-якому випадку використовують Pandas, тому в деяких випадках це може заощадити від додаткового імпорту бібліотек.

import pandas as pd
start = pd.Timestamp.now()
# code
print(pd.Timestamp.now()-start)

Вихід:

0 days 00:05:32.541600

Я б рекомендував використовувати це, якщо точність часу не найважливіша, інакше використовуйте timeбібліотеку:

%timeit pd.Timestamp.now() виводить 3,29 мкс ± 214 нс на петлю

%timeit time.time() виводить 154 нс ± 13,3 нс на петлю



1

Введення коду у функцію, а потім використання декоратора для хронометражу - ще один варіант. ( Джерело ) Перевага цього методу полягає в тому, що ви визначаєте таймер один раз і використовуєте його з простим додатковим рядком для кожної функції.

Спочатку визначте timerдекоратора:

import functools
import time

def timer(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.perf_counter()
        value = func(*args, **kwargs)
        end_time = time.perf_counter()
        run_time = end_time - start_time
        print("Finished {} in {} secs".format(repr(func.__name__), round(run_time, 3)))
        return value

    return wrapper

Потім, використовуючи декоратор, визначаючи функцію:

@timer
def doubled_and_add(num):
    res = sum([i*2 for i in range(num)])
    print("Result : {}".format(res))

Спробуймо:

doubled_and_add(100000)
doubled_and_add(1000000)

Вихід:

Result : 9999900000
Finished 'doubled_and_add' in 0.0119 secs
Result : 999999000000
Finished 'doubled_and_add' in 0.0897 secs

Примітка: Я не впевнений, чому використовувати time.perf_counterзамість time.time. Коментарі вітаються.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.