Получить таймеры в Python
Я просто пытаюсь найти фрагмент кода. Псевдокод выглядит так:
start = get_ticks()
do_long_code()
print "It took " + (get_ticks() - start) + " seconds."
Как это выглядит на Python?
В частности, как получить количество тиков с полуночи (или, тем не менее, Python организует это время)?
Ответы
Ответ 1
В модуле time
существуют две функции синхронизации: time
и clock
. time
дает вам "настенное" время, если это то, о чем вы заботитесь.
Однако, python docs говорит, что clock
следует использовать для бенчмаркинга. Обратите внимание, что clock
ведет себя по-разному в отдельных системах:
- в MS Windows он использует функцию Win32 QueryPerformanceCounter(), с "разрешением обычно лучше, чем микросекунда". Это не имеет особого значения, это просто номер (он начинает считать первый раз, когда вы вызываете
clock
в свой процесс).
# ms windows
t0= time.clock()
do_something()
t= time.clock() - t0 # t is wall seconds elapsed (floating point)
- on * nix,
clock
сообщает время процессора. Теперь это другое и, скорее всего, значение, которое вы хотите, поскольку ваша программа практически никогда не является единственным процессом, запрашивающим процессорное время (даже если у вас нет других процессов, ядро время от времени использует процессорное время). Таким образом, это число, которое обычно меньше ¹, чем время стены (т.е. Time.time() - t0), более значимо для кода сравнения:
# linux
t0= time.clock()
do_something()
t= time.clock() - t0 # t is CPU seconds elapsed (floating point)
Помимо всего этого, модуль timeit имеет класс Timer
, который должен использовать то, что лучше всего подходит для бенчмаркинга из доступных функциональность.
¹, если потоковая передача не мешает...
² Python ≥3.3: time.perf_counter()
и time.process_time()
. perf_counter
используется модулем timeit
.
Ответ 2
Вам нужна функция time()
из модуля time
:
import time
start = time.time()
do_long_code()
print "it took", time.time() - start, "seconds."
Вы можете использовать timeit для дополнительных параметров.
Ответ 3
Вот решение, которое я начал использовать недавно:
class Timer:
def __enter__(self):
self.begin = now()
def __exit__(self, type, value, traceback):
print(format_delta(self.begin, now()))
Вы используете его так (вам нужно хотя бы Python 2.5):
with Timer():
do_long_code()
Когда ваш код заканчивается, таймер автоматически распечатывает время выполнения. Милая! Если я пытаюсь быстро что-то сканировать в Python Interpreter, это самый простой способ.
И вот пример реализации "now" и "format_delta", хотя вы можете использовать свой предпочтительный метод выбора времени и форматирования.
import datetime
def now():
return datetime.datetime.now()
# Prints one of the following formats*:
# 1.58 days
# 2.98 hours
# 9.28 minutes # Not actually added yet, oops.
# 5.60 seconds
# 790 milliseconds
# *Except I prefer abbreviated formats, so I print d,h,m,s, or ms.
def format_delta(start,end):
# Time in microseconds
one_day = 86400000000
one_hour = 3600000000
one_second = 1000000
one_millisecond = 1000
delta = end - start
build_time_us = delta.microseconds + delta.seconds * one_second + delta.days * one_day
days = 0
while build_time_us > one_day:
build_time_us -= one_day
days += 1
if days > 0:
time_str = "%.2fd" % ( days + build_time_us / float(one_day) )
else:
hours = 0
while build_time_us > one_hour:
build_time_us -= one_hour
hours += 1
if hours > 0:
time_str = "%.2fh" % ( hours + build_time_us / float(one_hour) )
else:
seconds = 0
while build_time_us > one_second:
build_time_us -= one_second
seconds += 1
if seconds > 0:
time_str = "%.2fs" % ( seconds + build_time_us / float(one_second) )
else:
ms = 0
while build_time_us > one_millisecond:
build_time_us -= one_millisecond
ms += 1
time_str = "%.2fms" % ( ms + build_time_us / float(one_millisecond) )
return time_str
Пожалуйста, дайте мне знать, если у вас есть предпочтительный метод форматирования, или если есть более простой способ сделать все это!
Ответ 4
import datetime
start = datetime.datetime.now()
do_long_code()
finish = datetime.datetime.now()
delta = finish - start
print delta.seconds
С полуночи:
import datetime
midnight = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
now = datetime.datetime.now()
delta = now - midnight
print delta.seconds
Ответ 5
модуль времени в python дает вам доступ к функции clock(), которая возвращает время в секундах как плавающая точка.
Различные системы будут иметь разную точность, основанную на настройке внутренних часов (тики в секунду), но обычно она составляет не менее 20 миллисекунд, а в некоторых случаях лучше, чем несколько микросекунд.
-Adam
Ответ 6
Если у вас есть много утверждений, которые вы хотите использовать, вы можете использовать что-то вроде этого:
class Ticker:
def __init__(self):
self.t = clock()
def __call__(self):
dt = clock() - self.t
self.t = clock()
return 1000 * dt
Тогда ваш код может выглядеть так:
tick = Ticker()
# first command
print('first took {}ms'.format(tick())
# second group of commands
print('second took {}ms'.format(tick())
# third group of commands
print('third took {}ms'.format(tick())
Таким образом вам не нужно набирать t = time()
перед каждым блоком и 1000 * (time() - t)
после него, сохраняя при этом контроль над форматированием (хотя вы тоже можете легко установить его в Ticket
).
Это минимальный выигрыш, но я думаю, что это удобно.