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