Получить таймеры в Python - PullRequest
       15

Получить таймеры в Python

41 голосов
/ 01 октября 2008

Я просто пытаюсь рассчитать кусок кода. Псевдокод выглядит так:

start = get_ticks()
do_long_code()
print "It took " + (get_ticks() - start) + " seconds."

Как это выглядит в Python?

Точнее, как узнать количество тиков с полуночи (или как Python организует это время)?

Ответы [ 6 ]

34 голосов
/ 01 октября 2008

В модуле time есть две функции синхронизации: time и clock. time дает вам время "стены", если это то, что вас волнует.

Однако, питон документы говорят, что 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.

31 голосов
/ 01 октября 2008

То, что вам нужно, это time() функция из time модуля:

import time
start = time.time()
do_long_code()
print "it took", time.time() - start, "seconds."

Вы можете использовать модуль timeit для большего количества опций.

4 голосов
/ 09 ноября 2012

Вот решение, которое я начал использовать недавно:

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()

Когда ваш код заканчивается, Timer автоматически распечатывает время выполнения. Милая! Если я пытаюсь быстро что-то использовать в интерпретаторе Python, это самый простой способ.

А вот пример реализации '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

Пожалуйста, дайте мне знать, если у вас есть предпочтительный метод форматирования, или если есть более простой способ сделать все это!

2 голосов
/ 01 октября 2008

Модуль времени в python предоставляет вам доступ к функции clock (), которая возвращает время в секундах в виде плавающей запятой.

Разные системы будут иметь разную точность в зависимости от их внутренней синхронизации (тиков в секунду), но обычно она составляет не менее 20 миллисекунд, а в некоторых случаях лучше, чем несколько микросекунд.

-Adam

2 голосов
/ 01 октября 2008
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
0 голосов
/ 27 февраля 2016

Если у вас есть много утверждений, которые вы хотите рассчитать, вы можете использовать что-то вроде этого:

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).

Это минимальный выигрыш, но я думаю, что это довольно удобно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...