Sunday 27 January 2013

Как измерить время выполнения секции кода в python

Пришлось реализовать замер времени выполнения кода и вспомнил один вариант на который когда-то натолкнулся. (К сожалению ссылку на оригинал потерял, но принцип очень простой).
Создаём класс с двумя переопределёнными методами:

import time

class Profiler(object):
    def __enter__(self):
        self._startTime = time.time()
        
    def __exit__(self, type, value, traceback):
        print "Elapsed time: {:.3f} sec".format(time.time() - self._startTime)


И далее в коде используем следующим образом:

with Profiler() as p:
    // your code to be profiled here


Соответсвенно всё понятно из приведённого примера. При входе в конструкцию with объект создаётся, а при выходе гарантированно завершается. Даже при возникновении исключения.
Очень хорошая статья поясняющая детали.
Если есть ещё какие-нибудь красивые методы был бы рад о них услышать.

7 comments:

  1. Отличный пример, только опечатку надо поправить ;)

    with Profiler() as p:

    ReplyDelete
  2. This comment has been removed by the author.

    ReplyDelete
  3. Огромная благодарность. Мне это и было нужно.

    ReplyDelete
  4. # пример для Python 3
    import math, time

    class Profiler(object):
    def __enter__(self):
    self._startTime = time.time()

    def __exit__(self, type, value, traceback):
    print ("Elapsed time: {:.3f} sec".format(time.time() - self._startTime))


    with Profiler() as p:
    # your code to be profiled here
    value = 0.0
    msqrt = 0.0
    for i in range (100000):
    msqrt = math.sqrt(i)
    value += math.sqrt(i)
    value += math.sqrt(value)
    print (i, ' ', msqrt,' ', value)

    ReplyDelete
  5. Красивый метод - использование декораторов:

    '''
    import time

    def benchmark(func):
    def wrapper(*args, **kwargs):
    t = time.clock()
    res = func(*args, **kwargs)
    print(func.__name__, time.clock() - t)
    return res
    return wrapper
    '''

    Потом перед функцией пишем @benchmark и она будет исполнена с замером времени выполнения

    ReplyDelete
  6. я не стал париться и в своей программе в нужных местах просто нашёл время с начала эпохи в секундах, а потом через разность) работает.
    import time
    a=time.time()
    #ост. код
    b=time.time()
    timepr=b-a
    (писал на питон 3, винда)

    ReplyDelete