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 объект создаётся, а при выходе гарантированно завершается. Даже при возникновении исключения.
Очень хорошая статья поясняющая детали.
Если есть ещё какие-нибудь красивые методы был бы рад о них услышать.

5 comments:

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

    with Profiler() as p:

    ReplyDelete
    Replies
    1. Тимур, спасибо. Поправил.

      Delete
  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