2010-02-24 1 views
12

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

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 в более чистой дороге, но я не хочу, чтобы сделать отдельную функцию для блока кода.

спасибо.

+0

Как насчет внутренней функции? В чем причина не отделять это от отдельной функции? – Skilldrick

+1

Поскольку с точки зрения дизайна это не имеет смысла - я хочу, чтобы каждая функция делала что-то сложное, чтобы сообщать о своем собственном времени, но только для блока, который является вычислительно интенсивным. Я не хочу размножать функции с целью определения времени – user248237dfsf

ответ

25

Вы можете сделать это с помощью инструкции 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 

    #... 
+1

+1. Если вы находитесь в Linux и хотите измерять время настенных часов вместо процессорного времени, вы, вероятно, захотите использовать 'time.time' вместо' time.clock'. Подробнее см. [Документация библиотеки Python] (https://docs.python.org/2/library/time.html). –

2

Вы можете создать переменную для обозначения блока кода, который требуется время, поставив этот блок внутри тройные кавычки 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) 

Что для меня напечатал:

0,000341892242432

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

0

Согласно Skilldrickanswer есть глупый модуль, который, я думаю, может помочь: 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) 
Смежные вопросы