блок времени кода в Python, не помещая его в функцию - PullRequest
12 голосов
/ 24 февраля 2010

Я хотел бы рассчитать блок кода, не помещая его в отдельную функцию. например:

def myfunc:
  # some code here
  t1 = time.time()
  # block of code to time here
  t2 = time.time()
  print "Code took %s seconds." %(str(t2-t1))

однако я бы хотел сделать это с модулем timeit более понятным способом, но я не хочу делать отдельную функцию для блока кода.

спасибо.

Ответы [ 3 ]

26 голосов
/ 24 февраля 2010

Вы можете сделать это с помощью оператора with. Например:

import time    
from contextlib import contextmanager

@contextmanager  
def measureTime(title):
    t1 = time.clock()
    yield
    t2 = time.clock()
    print '%s: %0.2f seconds elapsed' % (title, t2-t1)

Для использования следующим образом:

def myFunc():
    #...

    with measureTime('myFunc'):
        #block of code to time here

    #...
2 голосов
/ 24 февраля 2010

Вы можете установить переменную для ссылки на блок кода, который хотите установить, поместив этот блок в тройные кавычки Python. Затем используйте эту переменную при создании экземпляра объекта timeit. Несколько следуя примеру из Python timeit docs , я придумал следующее:

import timeit
code_block = """\
total = 0
for cnt in range(0, 1000):
    total += cnt
print total
"""
tmr = timeit.Timer(stmt=code_block)
print tmr.timeit(number=1)

Который для меня напечатан:

499500

+0,000341892242432

(где 499500 - выход синхронизированного блока, а 0.000341892242432 - время работы.)

0 голосов
/ 03 сентября 2013

Согласно Skilldrick ответ есть глупый модуль, который, я думаю, может помочь: BlockLogginInator .

import time
from blocklogginginator import logblock  # logblock is the alias

with logblock(name='one second'):
    """"
    Our code block.
    """
    time.sleep(1)

>>> Block "one second" started 
>>> Block "one second" ended (1.001)
...