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

ОБНОВИТЬ:

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

класс timeit.Timer(stmt='pass', setup='pass', timer=)

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

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


person max    schedule 24.04.2012    source источник


Ответы (2)


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

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

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

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

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

person Andrew Clark    schedule 24.04.2012
comment
Спасибо .. не могли бы вы проверить обновленный вопрос? И на самом деле timeit.timeit('a=1;b=1') работает нормально... - person max; 24.04.2012
comment
@max — точки с запятой отлично подходят для разделения операторов с одинаковым уровнем отступа, но любые пробелы или символы табуляции, которые вы ставите между точкой с запятой и следующим оператором, будут игнорироваться, поэтому вы не можете использовать их с отступом. - person Andrew Clark; 24.04.2012
comment
@max, ; не будет работать для try/except, для циклов, циклов while, блоков if и т. д. Он работает только для разделения простых операторов. - person Winston Ewert; 24.04.2012

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

import timeit
import textwrap
print(timeit.timeit(textwrap.dedent("""
  try:
    a=1
  except:
    pass
  """), number=10))
person Tim Cederquist    schedule 23.10.2017