10

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 也可能包含多个语句,用 ; 分隔。或换行符,只要它们不包含多行字符串文字。

4

2 回答 2

23

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

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

虽然这可能更具可读性:

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

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

于 2012-04-24T16:22:48.373 回答
0

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

import timeit
import textwrap
print(timeit.timeit(textwrap.dedent("""
  try:
    a=1
  except:
    pass
  """), number=10))
于 2017-10-23T22:23:19.297 回答