2012-04-24 2 views
8

Я не могу показаться, чтобы получить timeit.timeit работать, когда у меня есть исключения в аргументе заявление передается в виде строки:Использование внутри timeit запятой

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

Это приводит к:

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 

Я запуская его с Python 3.3, но такая же ошибка происходит и со старым Python (3.2).

UPDATE:

Я следовал this documentation (курсив мой):

класса timeit.Timer (STMT = 'проход', настройки = 'проход', таймер =)

Class для синхронизации времени выполнения небольших фрагментов кода.

Конструктор принимает инструкцию для синхронизации, дополнительную инструкцию , используемую для настройки, и функцию таймера. Оба оператора по умолчанию: 'pass'; функция таймера зависит от платформы (см. строку модуля doc ). stmt и setup могут также содержать несколько операторов, разделенных ; или символы новой строки, если они не содержат многострочной строки литералов.

ответ

19

Вам необходимо обеспечить правильно отступом код с символами новой строки, а не полуколонами. Попробуйте изменить его на следующее:

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

Хотя это может быть более удобным для чтения, как:

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

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

+0

Спасибо .. вы можете проверить обновленный вопрос? И фактически 'timeit.timeit ('a = 1; b = 1')' отлично работает ... – max

+0

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

+0

@max, ';' не будет работать для try/except, для циклов, while циклов, если блоков и т. Д. Он работает только для разделения простых операторов. –

0

Это старый поток, но это может стоить обновления. Другой вариант, который использует textwrap для улучшения удобочитаемости, позволяя коду базового уровня отступа:

import timeit 
import textwrap 
print(timeit.timeit(textwrap.dedent(""" 
    try: 
    a=1 
    except: 
    pass 
    """), number=10)) 
Смежные вопросы