2010-02-24 10 views
12

Me gustaría sincronizar un bloque de código sin ponerlo en una función separada. por ejemplo:bloque de tiempo de código en Python sin ponerlo en una función

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

sin embargo, me gustaría hacer esto con el módulo timeit de una manera más limpia, pero no quiero hacer una función separada para el bloque de código.

gracias.

+0

¿Qué tal una función interna? ¿Cuál es la razón detrás de no separar esto en una función separada? – Skilldrick

+1

Porque desde una perspectiva de diseño no tiene sentido: quiero que cada función que hace algo complicado informe su propio tiempo, pero solo para el bloque que es computacionalmente intenso. No quiero proliferar funciones con el propósito de sincronizar – user248237dfsf

Respuesta

25

Puede hacer esto con la instrucción with. Por ejemplo:

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) 

Para usarse como esto:

def myFunc(): 
    #... 

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

    #... 
+1

+1. Si está en Linux y desea medir el tiempo del reloj de pared en lugar del tiempo del procesador, probablemente desee utilizar 'time.time' en lugar de' time.clock'. Consulte la [documentación de la biblioteca de Python] (https://docs.python.org/2/library/time.html) para obtener detalles. –

2

Puede establecer una variable para hacer referencia al bloque de código que desee en cuando poniendo ese bloque dentro de comillas triples de Python. Luego usa esa variable al crear una instancia de tu objeto timeit. Un poco después de un ejemplo de la Python timeit docs, me ocurrió lo siguiente:

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) 

que para mí impresas

0,000341892242432

(Donde 499.500 es el salida del bloque temporizado, y 0.000341892242432 es el tiempo de ejecución).

0

De acuerdo con Skilldrickanswer hay un módulo tonto que creo que puede ayudar: 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) 
Cuestiones relacionadas