Использование точек с запятой внутри 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).

ОБНОВИТЬ:

Я следил за этой документацией (выделение мое):

class timeit.Timer (stmt = 'pass', setup = 'pass', timer =)

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

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

2 ответа

Решение

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

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

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

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

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

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

import timeit
import textwrap
print(timeit.timeit(textwrap.dedent("""
  try:
    a=1
  except:
    pass
  """), number=10))
Другие вопросы по тегам