2012-04-24 14 views
8

Me parece que no puede conseguir timeit.timeit a trabajar cuando tengo excepciones en el argumento de la declaración aprobada como cadena:Uso de punto y coma dentro timeit

# after the first and third semicolon, I put 4 spaces 
timeit.timeit('try:; a=1;except:; pass') 

Esto se traduce en:

Traceback (most recent call last): 
    File "a.py", line 48, in <module> 
    timeit.timeit('try:; a=1;except:; pass') 
    File "C:\CPython33\lib\timeit.py", line 230, in timeit 
    return Timer(stmt, setup, timer).timeit(number) 
    File "C:\CPython33\lib\timeit.py", line 136, in __init__ 
    code = compile(src, dummy_src_name, "exec") 
    File "<timeit-src>", line 6 
    try:; a=1;except:; pass 
     ^
SyntaxError: invalid syntax 

estoy ejecutarlo con Python 3.3, pero el mismo error ocurre incluso con el viejo Python (3.2).

ACTUALIZACIÓN:

estaba siguiendo this documentation (el énfasis es mío):

timeit.Timer clase (prop 'pase' =, = configuración 'pase', temporizador =)

Clase para temporizar la velocidad de ejecución de pequeños fragmentos de código.

El constructor toma una instrucción para ser temporizada, una instrucción adicional utilizada para la configuración y una función de temporizador. Ambas declaraciones por defecto son 'pass'; la función del temporizador depende de la plataforma (consulte la cadena del documento ). stmt y setup también pueden contener múltiples declaraciones separadas por; o saltos, siempre que no contengan literales de varias líneas literales.

Respuesta

19

Debe proporcionar el código apropiadamente sangrado con líneas nuevas, no punto y coma. Intente cambiar a la siguiente:

timeit.timeit('try:\n a=1\nexcept:\n pass') 

Aunque esto puede ser más fácil de leer como:

stmt = '''\ 
try: 
    a=1 
except: 
    pass''' 
timeit.timeit(stmt) 

punto y coma va a funcionar bien para separar las declaraciones que tendrían el mismo nivel de sangría, pero espacios ni le pestañas poner entre el punto y coma y la siguiente declaración se ignorará por lo que no puede usarlos con sangría.

+0

Gracias .. ¿puedes por favor verifica la cuestión actualizada? Y de hecho 'timeit.timeit ('a = 1; b = 1')' funciona bien ... – max

+0

@max - Los puntos y coma funciona bien para separar declaraciones que tendrían el mismo nivel de sangría, pero cualquier espacio o pestaña que pones entre el punto y coma y la siguiente instrucción se ignorarán para que no pueda usarlos con sangría. –

+0

@max, el ';' no funcionará para try/except, for loops, while loops, if blocks, etc. Solo funciona para separar declaraciones simples. –

0

Este es un hilo antiguo, pero podría valer la pena una actualización. Otra opción que se utiliza para mejorar la legibilidad TextWrap permitiendo código de un nivel básico de la sangría:

import timeit 
import textwrap 
print(timeit.timeit(textwrap.dedent(""" 
    try: 
    a=1 
    except: 
    pass 
    """), number=10)) 
Cuestiones relacionadas