在timeit中使用分号

时间:2012-04-24 16:19:17

标签: python exception 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)也会出现同样的错误。

更新:

我关注this documentation(强调我的):

  

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

     

小代码片段的定时执行速度等级。

     

构造函数接受一个声明来定时,这是一个额外的声明   用于设置和计时器功能。两个语句都默认为   '通过';计时器功能与平台有关(参见模块文档   串)。 stmt和setup也可能包含多个分隔的语句   by; 或换行符,只要它们不包含多行字符串   文字。

2 个答案:

答案 0 :(得分:21)

您需要使用换行符提供正确的缩进代码,而不是分号。尝试将其更改为以下内容:

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

虽然这可能更具可读性:

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

分号可以很好地分离具有相同缩进级别的语句,但是您在分号和下一个语句之间放置的任何空格或制表符都将被忽略,因此您不能将它们与缩进一起使用。

答案 1 :(得分:0)

这是一个旧线程但可能值得更新。使用textwrap通过允许代码进行基本级别缩进来提高可读性的另一个选项:

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